项目Euler#16在Python上

时间:2017-07-26 08:30:47

标签: python

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

这就是我对Project Euler #16的想法,它适用于较小的数字。但当我尝试2 1000 时,代码给了我1289.0而不是答案1366(在互联网上找到了这个)。我认为问题可能与数字的大小有关,但我不确定。任何正确方向的点都将受到赞赏。提前谢谢!

修改:问题为https://projecteuler.net/problem=16

4 个答案:

答案 0 :(得分:4)

原因是math.pow(2,1000)返回float而不是int。因此,操作num/10会返回与预期不同的答案。

使用2 ** 1000致电时,会返回预期答案。

编辑:如果是python 3,请注意Hans评论或tobias_k有关整数除法的答案。

答案 1 :(得分:1)

问题是math.pow返回一个浮点数,对于那个大的数字,浮点精度不足以给你一个精确的答案。像这样改变你的功能:

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

或更短:

print(sum(int(c) for c in str(2**1000)))

答案 2 :(得分:0)

我说你的数字计算完全错了。它可以更容易实现:

import math

number = str(int(math.pow(2,1000)))
total = 0

for i in number:
    total += int(i)

print(total) #1366

只需计算2 1000 的结果,将其转换为str并通过数字进行总结。

答案 3 :(得分:0)

没有数学模块,基本上可以这样完成:

a=list(str(2**1000))
b=0
for i in range(0,len(a)):
b+=int(a[i])
print(b)