2016-09-14 1 views
0

Here is the problem:Python Project Euler значные пятые полномочия

Удивительно, но только три числа, которые могут быть записаны как сумму четвертых степеней их цифр:

1634 = 1^4 + 6^4 + 3^4 + 4^4
8208 = 8^4 + 2^4 + 0^4 + 8^4
9474 = 9^4 + 4^4 + 7^4 + 4^4

Поскольку 1 = 1^4 не является суммой, она не включена.

Сумма этих чисел 1634 + 8208 + 9474 = 19316.

Найти сумму всех чисел, которые можно записать в виде суммы пятых степеней их цифр.

И вот мой код:

summ = 0 
digit_sum = 0 
i = 0 
while i < 1000000: 
    j = list(str(i)) 
    for x in j: 
     digit = int(x) ** 5 
     digit_sum += digit 
    if digit_sum == i: 
     summ += i 
     print(i) 
    else: 
     digit_sum = 0 
    i += 1 
print(summ) 

Может кто-нибудь узнать, что почему я пропускаю значение 4151, которое должно быть одним из правильного ответа?

+0

Я предлагаю использовать отладчик или добавлять в свой код инструкции 'print', чтобы выяснить, что он делает. Вы можете добавить оператор 'if' только для печати, когда цикл достигнет 4151. –

ответ

0

Проблема в вашем коде вы забыли сбросить digit_sum, когда вы получили ответ. Путь digit_sum = 0 до j = list(str(i)). Вы также начинаете с i = 0. Предлагаю начать с i = 10, так как первый 2-значный номер 10.

использование этого:

[i for i in range(10, 1000000) if i == sum(int(d) ** 5 for d in str(i))] 

эквивалентны:

[4150, 4151, 54748, 92727, 93084, 194979] 

используя сумму:

sum(i for i in range(10, 1000000) if i == sum(int(d) ** 5 for d in str(i))) 

эквивалентный с:

443839 
+0

1 не включен. Должно быть 'range (2, 100000)'. Правильный ответ: 443839. – gobrewers14

+0

может быть 'range (10, 1000000)', если не принят ни один цифровой номер. –

+0

Верхний предел диапазона должен быть «sum (int (d) ** 5 для d в« 9 »* 5)' или '295245' –

1

4150 также в решениях. Значение digit_sum не установлено до 0 до 4151. Вы должны установить digit_sum = 0 на каждом шаге.

summ = 0 
digit_sum = 0 
i = 0 
while i < 1000000: 
    digit_sum = 0 # should be set in each step 
    j = list(str(i)) 
    for x in j: 
     digit = int(x) ** 5 
     digit_sum += digit 
    if digit_sum == i: 
     summ += i 
     print(i) 
    i += 1 
print(summ) 
-1

Ответ на ваш вопрос в том, что вы не сбрасываете digit_sum каждый раз, только тогда, когда digit_sum != i. Если вы удалите оператор else, он должен работать правильно.

if digit_sum == i: 
    summ += i 
    print(i) 
digit_sum = 0 
i += 1