2011-02-03 56 views
6

您好我一直在尝试这种problem总结数字!

Suppose P(n) is sum of digits of 2^n
For example:
As 2^15 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26,so P(15)=26.
Catulate sum of the P(n) for n=1 to 10000.

这是我python code这是给作为答案,但法官似乎并不在此是同意:

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) 

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

+1

@Tretwick Marian:你为什么不把代码带到这里并描述问题。当这两个链接消失。这篇文章将变得不相关。 – pyfunc 2011-02-03 19:19:58

+0

增加了问题描述和代码。 – 2011-02-03 19:22:36

+0

您是否尝试过打印P(15)? P(1000)或P(10000)如何? – 2011-02-03 19:23:18

回答

9

如果你表现出的意见,你就已经注意到,该网站拥有者,或迈问题ntainer,是一个白痴。

他的意思是说从“0到10000”,而不是“1到10000”,但显然这个问题不能被编辑,或维护不希望这样做。

总和是关闭的1,因为1<<0是1,其加1之和。

尝试提交67783432.

注意:我意识到,调用网站所有者或白痴听起来刺耳的维护者,但在一个关于“数学”网站上张贴内容时,精度是有点重要。有这样的网站没有能力或要求来修复错误的问题,似乎对我来说很愚蠢。

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 
0

这里有一个替代实现,确认你的答案是正确的:即memoizes

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

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

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

(注意这个计算P(i)的总和,对于i = 0〜10000)

0

实际上,由于Java的不能产生如此大量的(除非你使用的BigInteger类 - 这是我从来没有用过),它的更好,如果你使用灵活的语言如Python

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

尝试这在python

A = 2 ** 1000 打印的(a)

再从蟒的输出作为一个字符串,并采取总和每个数字