1

我正在练习 Project Euler,我正在解决一个问题,以计算2 ** 1000Python 中 (2 ^ 1000) 中的数字总和。我的代码

z = 2 ** 1000
print(z)

sum = 0
while z > 0:
    x = int(z % 10)
    sum += x
    z = z / 10

print(sum)

给出结果

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
1189

虽然 Python 能够为 z 计算正确的值,但 z 中的数字总和是错误的。为什么总和不正确?

4

2 回答 2

2

令人惊讶的是,Python 2.7 和 3.3 给出了不同的结果。2.7 给出 as1366和 3.3的数字总和1189。虽然您的程序在 Python 2.7 上是正确的,但您必须记住的语义/在 Python 3 中发生了变化,并且 Python 3 上的整数除法运算符是//; 否则,您除以 10 会将数字转换为浮点数(并失去精度)。因此

z = 2**1000
sum = 0
while z > 0:
    x = int(z % 10)
    sum += x
    z //= 10
print(sum)

Python 2.6 和 2.7 也可以使用新的除法运算符,方法是使用

from __future__ import division

在每个文件的开头。

于 2013-08-17T14:53:20.513 回答
0

而不是连接sum,将sum的值完全更改为x不是理想的,所以写sum=x而不是sum+=x

于 2013-08-17T19:19:56.497 回答