2017-10-05 61 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中,我们使用//进行地板划分(这就是你想要的)。