使用/和%计算数字中的数字总和,结果不正确

时间:2013-08-17 14:48:41

标签: python math python-3.x

我在Project Euler上练习,我正在研究用Python计算2 ** 1000(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中的数字总和是错误的。为什么总和不正确?

2 个答案:

答案 0 :(得分:2)

令人惊讶的是,Python 2.7和3.3给出了不同的结果。 2.7给出了1366和3.3 1189的数字之和。虽然您的程序在Python 2.7上是正确的,但您必须记住the semantics of / have changed in 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

在每个文件的开头。

答案 1 :(得分:0)

不是将sum连接起来,将变化和的值完全改为x是不理想的,所以写sum = x而不是sum + = x