Уведомления

Группа в Telegram: @pythonsu

#1 Май 14, 2021 01:22:30

Lee
Зарегистрирован: 2021-03-21
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

25 задача Егэ

Задача: Дана последовательнсоть чисел от 2 до 20000
Найти все почти совршенные числа(т.е те числа у которых разность между самим числом и суммой его делителей равна единице)
в ответ запишите максимальное из них.
Вот мой код:

 from math import sqrt
for i in range(2,20001):
    x=[]
    for j in range(2,int(sqrt(i))):
        if i%j==0:
            x.append(j)
            x.append(i//j)
            x.sort()
    if i-sum(x)==1:
        print(i,sum(x))
Ответ в сборнике(16384, у меня 8128) Не могу понять, где у меня ошибка. Заранее спасибо за помощь

Офлайн

#2 Май 14, 2021 04:01:40

Ocean
Зарегистрирован: 2021-03-14
Сообщения: 131
Репутация: +  9  -
Профиль   Отправить e-mail  

25 задача Егэ

 
for number in range(2, 20000):
divider_sum = 0
for divider in range(1, int(number // 2 + 1)):
if number % divider == 0:
divider_sum += divider
if number - divider_sum == 1:
print(number, divider_sum)

выводит:

 
2 1
4 3
8 7
16 15
32 31
64 63
128 127
256 255
512 511
1024 1023
2048 2047
4096 4095
8192 8191
16384 16383

Ошибка в твоем коде, когда задаешь диапазон возможных делителей числа. И я не поняла зачем дальше сортировка х происходит, например.

Чтобы выполнилась именно поставленная задача: “напечатать максимальное почти совершенное число”, добавляем еще пару строк:

  
numbers = []
for number in range(2, 20000+1):
    divider_sum = 0
    for divider in range(1, int(number // 2 + 1)):
        if number % divider == 0:
            divider_sum += divider
    if number - divider_sum == 1:
        numbers.append(number)
 
maximal_number = max(numbers)
print(maximal_number)

Отредактировано Ocean (Май 14, 2021 04:17:09)

Офлайн

#3 Май 14, 2021 09:52:51

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

25 задача Егэ

Lee Потому что вы не учитываете что делитель может быть один. Если i==i//j вы всеравно добавляете его два раза. НУ и плюс непонятно почему 1 считается делителем, а само число нет. Есди добавить в условие что 1 считаем, а само число не считаем то все сходиться:

 from math import sqrt
for i in range(2,20001):
    x=[1,]
    for d in range(2, int(sqrt(i))+1):
        if i%d==0:
            x.append(d)
            if i//d!=d:
                x.append(i//d)
    if i-sum(x)==1:
        print(i,sum(x))
>>>
2 1
4 3
8 7
16 15
32 31
64 63
128 127
256 255
512 511
1024 1023
2048 2047
4096 4095
8192 8191
16384 16383
PS все “совршенные числа” это степени двойки.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 14, 2021 09:55:20)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version