【问题标题】:Python Project Euler digit fifth powersPython Project Euler 数字五次方
【发布时间】:2016-09-14 23:35:16
【问题描述】:

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?

【问题讨论】:

  • 我建议使用调试器或在您的代码中添加print 语句来弄清楚它在做什么。您可以添加一个if 语句以仅在循环到达 4151 时打印。

标签: python loops sum project digit


【解决方案1】:

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

【讨论】:

  • 1 不包括在内。应该是range(2, 100000)。正确答案是 443839。
  • 如果不接受单个数字,则可能是 range(10, 1000000)。
  • 范围上限只需要sum(int(d)**5 for d in "9"*5),或者295245
【解决方案2】:

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)

【讨论】:

  • 同样在从 10 开始的编辑中删除了问题定义中的 1,省略了 1。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2012-10-11
    相关资源
    最近更新 更多