Python上的Euler#16项目
这就是我对“Euler 16项目”的想法,它适用于较小的数字。但当我尝试21000时,代码给了我Python上的Euler#16项目,python,Python,这就是我对“Euler 16项目”的想法,它适用于较小的数字。但当我尝试21000时,代码给了我1289.0而不是答案1366(在互联网上找到)。我认为问题可能与数字的大小有关,但我不确定。任何方向正确的点都将受到赞赏。提前谢谢 编辑:这里有一个问题我想说你的数字计算完全错误。实现这一目标要容易得多: import math def sumOfDigit(num): sum_of_digits = 0 while num > 9: sum_of_digit
1289.0
而不是答案1366
(在互联网上找到)。我认为问题可能与数字的大小有关,但我不确定。任何方向正确的点都将受到赞赏。提前谢谢
编辑:这里有一个问题我想说你的数字计算完全错误。实现这一目标要容易得多:
import math
def sumOfDigit(num):
sum_of_digits = 0
while num > 9:
sum_of_digits += num % 10
num = int(num/10)
sum_of_digits += num
return sum_of_digits
print sumOfDigit(math.pow(2,1000))
只需计算21000的结果,将其转换为
str
,然后对数字进行汇总。原因是math.pow(21000)
返回一个float
而不是int
。因此,操作num/10
返回的答案与预期的不同
使用2**1000
呼叫时,将返回预期的答案
编辑:对于python 3,请注意有关整数除法的注释或答案。问题是返回一个浮点数,而对于这么大的数字,浮点数精度不足以给出精确的答案。如下更改您的函数:
import math
number = str(int(math.pow(2,1000)))
total = 0
for i in number:
total += int(i)
print(total) #1366
print(sum(int(c) for c in str(2**1000)))
或更短:
def sumOfDigit(num):
sum_of_digits = 0
while num > 9:
sum_of_digits += num % 10
num = num // 10 # use integer division // instead of /
sum_of_digits += num
return sum_of_digits
print(sumOfDigit(pow(2, 1000))) # use builtin pow or ** operator instead of math.pow
没有数学模块,基本上可以这样做:
import math
number = str(int(math.pow(2,1000)))
total = 0
for i in number:
total += int(i)
print(total) #1366
print(sum(int(c) for c in str(2**1000)))
请在问题中包含您试图实现的目标,而不是作为外部链接。出乎意料的是,这是有效的。我不明白
int(math.pow(21000))
如何找到所有的数字,因为math.pow(21000)
是一个浮点数。你有什么解释吗?@Gribouillis可能是因为它是2的幂,因此可以精确地表示为一个浮点数。@tobias_k事实上,2**1000
在64位上的ieee754表示形式是0 11111100111 0000000000000000000000000000000000000000000000000000000000000000
。所有信息都在指数中。这是一个精确的数字。正如Elisha所指出的,问题并不是严格意义上的math.pow的浮点表示,而是循环中被10除后得到的浮点结果是错误的。对于Python 3.5.2,即使使用2**1000
作为参数,我也遇到了同样的问题;另外,我必须在缩减步骤中使用floor division来获得正确的结果:num=num//10