对于任何N,令f(N)是最后五个 数字在 N!中的尾随零之前。例如,项目欧拉 - 问题160
9! = 362880 so f(9)=36288 10! = 3628800 so f(10)=36288 20! = 2432902008176640000 so f(20)=17664
查找F(1,000,000,000,000)
我已经成功地解决了这个问题,对于给定的例子,我的功能能够正确地找到F(9),F(10)等。然而,它与更大的数字斗争,特别是问题要求的数量 - f(10^12)。
我当前优化如下:我除去从乘法器和总和尾随零,并缩短每个相乘后的总和5个位数。在Python代码如下:
def SFTR (n):
sum, a = 1, 2
while a < n+1:
mul = int(re.sub("0+$","",str(a)))
sum *= mul
sum = int(re.sub("0+$","",str(sum))[-5:])
a += 1
return sum
谁能告诉我为什么这个功能缩放从而在很大程度上,为什么它这么久。此外,如果任何人都可以提示我正确的方向来优化我的算法。 (一般主题的名称就足够了)谢谢。
更新:
我已经做了一些优化的变化,这是显著快,但它仍然是速度不够快F(10^12)。任何人都可以告诉我什么让我的代码变慢或如何让它变得更快?
def SFTR (n):
sum, a = 1, 2
while a < n+1:
mul = a
while(mul % 10 == 0): mul = mul/10
mul = mul % 100000
sum *= mul
while(sum % 10 == 0): sum = sum/10
sum = sum % 100000
a += 1
return sum
10^12是一个很大的数字。在普通电脑上,你不能在一分钟内完成10^12的操作。 – starblue 2010-06-29 20:02:29