2017-10-05 60 views
0

我試圖解決本練習:電源數字和

https://projecteuler.net/problem=16

的代碼是不言自明:我計算功率(N)2^n,並且在總和(N),我切斷號碼的最後一位數字。只要pow> 0,我就可以做到這一點。我收到2^15的正確解決方案,但由於某種原因,相同的代碼不適用於2^1000。我收到1889年,這顯然是錯誤的。

def power(n): 
    power = 2 
    for x in range(1, n): 
     power = 2*power 
    return power 

def sum(n): 
    pow = power(n) 
    sum = 0 
    while pow > 0: 
     modulo = pow%10 
     sum = sum + modulo 
     pow = int((pow - modulo)/10) 
    return sum 

def main(): 
    print(int(sum(1000))) 

if __name__ == '__main__': 
    main() 
+0

「2^1000」的正確結果是什麼? –

+0

我不知道。 projecteuler只是告訴我,我的解決方案是錯誤的。 – Julian

+0

它不工作的方式? (錯誤,得到錯誤的答案等)另外,在函數sum中有一個變量'sum'。這會導致問題。如果我這樣做,我只是將'2 ** 1000'的字符串表示分解爲數字,將它們轉換爲int,然後使用內置的sum來將它們相加 –

回答

3

在你的代碼的簡單改變會給你正確的答案,

def power(n): 
    power = 2 
    for x in range(1, n): 
     power = 2*power 
    return power 

def sum(n): 
    pow = power(n) 
    sum = 0 
    while pow > 0: 
     modulo = pow%10 
     sum = sum + modulo 
     pow = pow//10 # modified line 
    return sum 

def main(): 
    print(int(sum(1000))) 

if __name__ == '__main__': 
    main() 

之所以你的例子不工作是因爲你鑄造浮點運算的結果爲int。浮球從來不會精確,當它們非常大時,它們會失去精度。因此,如果你將它們轉換回整數,你會得到一個非常低的值。

更好的功能使用divmod()是,

def sum(n): 
    pow = power(n) 
    sum = 0 
    while pow > 0: 
     pow,modulo = divmod(pow,10) 
     sum = sum + modulo 
    return sum 
+0

我現在收到了1366份,這是正確的答案。奇怪,沒想到這會造成那麼多廣告推斷,謝謝! – Julian

1

您的代碼不會爲任何數量> = 57

這裏的問題的工作很容易解決。

在python 3及更高版本中,/是一個返回float的分區,而//是一個總是返回整數的整數除法。由於您正在使用浮點除法,所以您遇到了浮點運算的問題。 More about the issues and limitations.

解決您的問題,改線

pow = int(pow - modulo)/10

pow = int(pow - modulo)//10

,甚至更好,你可以說pow//=10

是不是蟒蛇beatiful?

2

您原來的解決方案本來可以在Python 2中工作,因爲Python 2 and Python 3 handle division differently

例如print(1/2)在Python2中給出0,在Python3給出00.5。在Python3中,我們使用//進行地板劃分(這就是你想要的)。