对于任意N,设f(N)是N中尾随零点之前的最后五位数。例如,
9!= 362880 so f(9)=36288 10!= 3628800 so f(10)=36288 20!= 2432902008176640000 so (20)=17664
F(1,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发布于 2010-06-29 12:42:53
mul可以变得非常大。这有必要吗?如果我让你手工计算127834857293484728485612787487189900038* 38758的最后5个非零位数,你到底需要知道第一个数字的数字是多少?
发布于 2010-06-29 12:28:12
经常构建字符串是很昂贵的。当截断到最后五位数时,我宁愿使用模运算符。
python -m timeit 'x = str(111111111111111111111111111111111)[-5:]'
1000000 loops, best of 3: 1.09 usec per loop
python -m timeit 'x = 111111111111111111111111111111111 % 100000'
1000000 loops, best of 3: 0.277 usec per loop这同样适用于去掉尾随零。应该有一种更有效的方法来做到这一点,而且您可能不必在每一个步骤中都这样做。
不过,我没有检查您的算法是否正确,这只是一个优化的提示。
发布于 2010-06-29 15:02:18
实际上,您甚至可能会注意到,只有一组有限的可能尾随非零位数。如果我没记错的话,只有几千种可能的尾随非零数字组合,当你只看最后5位时。例如,最终的非零数字有可能是奇数吗?(忽略0的特殊情况!)还有1!在这里)
https://stackoverflow.com/questions/3140533
复制相似问题