Python Project Euler数字第五种力量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Project Euler数字第五种力量相关的知识,希望对你有一定的参考价值。

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

答案

您的代码中的问题是您在得到答案时忘记重置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
另一答案

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)
另一答案

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

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

以上是关于Python Project Euler数字第五种力量的主要内容,如果未能解决你的问题,请参考以下文章

project euler113

Project Euler 54: Poker hands

用 Javascript 解决 Project Euler 16

Project Euler 56: Powerful digit sum

Python 中的列表范围 - Project Euler 007

Python练习题 043:Project Euler 015:方格路径