2013-08-17 42 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

相關問題