总结数字!
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)
有人能告诉我我的方法有什么问题吗?如果有人向我指出一个相同的数学解决方案,我将不胜感激。
如果你表现出的意见,你就已经注意到,该网站拥有者,或迈问题ntainer,是一个白痴。
他的意思是说从“0到10000”,而不是“1到10000”,但显然这个问题不能被编辑,或维护不希望这样做。
总和是关闭的1,因为1<<0
是1,其加1之和。
尝试提交67783432.
注意:我意识到,调用网站所有者或白痴听起来刺耳的维护者,但在一个关于“数学”网站上张贴内容时,精度是有点重要。有这样的网站没有能力或要求来修复错误的问题,似乎对我来说很愚蠢。
您的解决方案需要相当一段时间才能运行(一分多钟,反正)。法官是否有时间限制解决方案可以运行的时间长度?
另外,如果你使用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
这里有一个替代实现,确认你的答案是正确的:即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
在功能编程方面更好的解决方案可能是:
>>> P = lambda n: sum(map(int, str(1 << n)))
>>> sum(P(i) for i in xrange(10001))
67783432
(注意这个计算P(i)的总和,对于i = 0〜10000)
实际上,由于Java的不能产生如此大量的(除非你使用的BigInteger类 - 这是我从来没有用过),它的更好,如果你使用灵活的语言如Python
的Python给了我2 ** 1000。它的一个非常庞大的数字,其解决方案是
尝试这在python
A = 2 ** 1000 打印的(a)
再从蟒的输出作为一个字符串,并采取总和每个数字
@Tretwick Marian:你为什么不把代码带到这里并描述问题。当这两个链接消失。这篇文章将变得不相关。 – pyfunc 2011-02-03 19:19:58
增加了问题描述和代码。 – 2011-02-03 19:22:36
您是否尝试过打印P(15)? P(1000)或P(10000)如何? – 2011-02-03 19:23:18