繁体   English   中英

Python上的Euler项目#16

[英]Project Euler #16 on 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

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

当使用2 ** 1000进行呼叫时,将返回预期的答案。

编辑:在python 3的情况下,请注意有关整数除法的Hans注释或tobias_k答案。

问题是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)))

我会说您的数字计算完全错误。 可以轻松实现:

import math

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

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

print(total) #1366

只需计算2 1000的结果,将其转换为str并通过数字求和即可。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM