Python上的Euler#16项目

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

这就是我对“Euler 16项目”的想法,它适用于较小的数字。但当我尝试21000时,代码给了我
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