我正在努力解决这个问题:
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 :(得分: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