功率数字总和

时间:2017-10-05 16:22:09

标签: python

我正在努力解决这个问题:

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()

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您的原始解决方案可以在Python 2中使用,因为Python 2 and Python 3 handle division differently

例如,print(1/2)在Python2中提供0,在Python3中提供0.5。在Python3中,我们使用//进行分层划分(这就是你想要的)。

答案 2 :(得分:1)

您的代码不适用于任何数字> = 57

这里的问题很容易解决。

在python 3及更高版本中,/是一个返回浮点数的除法,而//是一个整数除法,它总是返回一个整数。由于您正在使用浮点除法,因此您遇到了浮点运算的问题。 More about the issues and limitations.

要解决您的问题,请更改

pow = int(pow - modulo)/10

进入

pow = int(pow - modulo)//10

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

难道没有诅咒吗?

答案 3 :(得分:0)

def Power_digit_sum(n):
    number = list(str(2**n)) # pow number and convert number  in string and  list 
    result= [int(i) for i in number]# convert number in int and 
    return sum(result) # sum list
            
        
        
 print(Power_digit_sum(15)) # result 26
 print(Power_digit_sum(1000)) # result 1366