Power10**10给出错误的输出。可能是什么原因?
我的一个实习生为 Project Euler 中的一个问题制作了这个简短的 Python 脚本。
我们正在使用 Python 3.9.4
问题:数列,1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317。找出数列的最后十位数字,1 1 + 2 2 + 3 3 + ... + 1000 1000。
这不是最好的解决方案,但理论上它应该适用于小值(我知道它不适用于更大的值而效率低下,甚至 double 也太小了。
这是她的代码:
import math
import numpy as np
x = np.arange(1,11)
a=[]
for y in x:
z = y**y
a.append(z)
b=sum(a)
print(a)
输出:
[1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489, 1410065408]
脚本显然还没有完成,但是您可以看到每个 1 1、 2 2、 3 3 的幂都是正确的,直到 10 10都没有返回正确的值。
你有没有看到这个问题的任何原因,对我来说似乎很奇怪?我想不通。
是的,我知道这不是最好的解决方案,最终实际的解决方案会有所不同,但解决这个谜团仍然很好。
回答
您可能在某种 32 位系统上,其中 numpy 默认为 32 位整数。这导致结果被“截断”为 32 位。您可以使用以下表达式验证结果:
(10 ** 10) % (2 ** 32)
使用内置的 Python int,range除非你需要 numpy 提供的花哨的东西。它是一个任意精度的整数实现,应该适用于各种整数计算工作负载。