2013-08-17 40 views
1

我正在使用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

的Python 2.7和3.3出现不同的结果。 Python 2给出的总和为1366,Python 3为1189.这是因为Python 3从1/10返回0.1,而Python 2返回0 –

+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

因为Python 3.3对于1/10返回0.1 ',而Python 2.7返回0. – falsetru

+0

令我感到惊讶的是,Python对一个基本的操作符进行了如此剧烈的改变,例如/好像它是一些新出生的语言。 –

+1

感谢您的快速回复,希望这个问题可以帮助其他初学者 –

0

而不将之和,岂不是理想的彻底改变改变总和的价值为x,所以写总和= X,而不是总和+ = X

+0

这不会让'sum'成为最后一个'x'吗?在这种情况下,'z'的前导数字? – Teepeemm

相关问题