Python Project Euler数字第五种力量

时间:2016-09-14 23:35:17

标签: python loops sum project digit

Here is the problem

  

令人惊讶的是,只有三个数字可以写成   各位数的四次幂之和:

     

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,这应该是正确答案之一?

3 个答案:

答案 0 :(得分:2)

代码中的问题是,当您得到答案时,忘记重置digit_sum。 将digit_sum = 0放在j = list(str(i))之前。您也可以从i = 0开始。我建议从i = 10开始,因为前两位数字是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:

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

相当于:

443839

答案 1 :(得分:1)

4150也在解决方案中。在4151步之前,digit_sum未设置为0。你应该在每一步中设置digit_sum = 0.

summ = 0
i = 10
while i < 1000000:
    digit_sum = 0
    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)

答案 2 :(得分:-1)

您的问题的答案是,您每次都不会重置digit_sum,仅在digit_sum != i时。如果删除else语句,它应该可以正常工作。

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