总结数字!

时间:2011-02-03 19:17:53

标签: python algorithm math

您好我一直在试用problem

  

假设P(n)是2 ^ n的数字之和   例如:
  当2 ^ 15 = 32768且其数字之和为3 + 2 + 7 + 6 + 8 = 26时,所以P(15)= 26。
  捕获P(n)的总和,n = 1到10000。

以下是我的python code,其中 67783431 作为答案,但法官似乎对此并不同意:

def P(n):
    n = int(1<<n)
    S = 0
    while n != 0:
        S += (n%10)
        n /= 10
    return S

Sum = 0
for i in range(1,10001):
    Sum += P(i)
else:
    print(Sum)

有人能告诉我我的方法有什么问题吗?如果有人指出我的数学解决方案,我将不胜感激。

5 个答案:

答案 0 :(得分:9)

如果您已经显示了评论,那么您会注意到网站所有者或问题维护者是个白痴。

他的意思是说从“0到10000”,而不是“1到10000”,但显然问题无法编辑,或维护人员不想这样做。

由于1<<0为1,所以总和为1,这将为总和增加1。

尝试提交67783432。

注意:我意识到将网站所有者或维护者称为傻瓜可能听起来很苛刻,但是当在网站上发布关于“数学”的内容时,准确性是有点重要的。拥有这样一个没有能力或要求来解决错误问题的网站对我来说似乎有点愚蠢。

答案 1 :(得分:3)

在功能编程方面更优雅的解决方案可能是:

>>> P = lambda n: sum(map(int, str(1 << n)))
>>> sum(P(i) for i in xrange(10001))
67783432

(注意,这计算了i = 0到10000的P(i)之和。)

答案 2 :(得分:0)

您的解决方案需要相当长的时间才能运行(无论如何都要超过一分钟)。法官是否规定了解决方案可以运行的时间长度?

此外,如果您使用的是Python 3,则除法运算符(/=)始终会生成浮点结果。在Python 2中,结果将被截断为具有整数输入的整数。

实际上,在Python 3中我遇到了溢出错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 6, in P
OverflowError: int/int too large for a float

答案 3 :(得分:0)

这是一个替代实现,确认您的答案是正确的:

>>> sum(reduce(lambda x, y: x + int(y), str(2**n), 0) for n in xrange(1, 10001))
67783431

或者一个记忆:

>> reduce(lambda x, y: (sum(int(c) for c in str(x[1]*2)) + x[0], x[1]*2), xrange(0, 10000), (0,1))[0]
67783431

答案 4 :(得分:0)

实际上,由于Java不能产生如此大的数字(除非你使用我从未使用过的BigInteger类),如果你使用像Python这样灵活的语言,它会更好

Python给了我2 ** 1000。这是一个非常庞大的数字,解决方案是 1366

在python中尝试这个

a = 2 ** 1000 print(a)

然后将python的输出作为字符串并取每个数字的总和