首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Euler项目-问题160

Euler项目-问题160
EN

Stack Overflow用户
提问于 2010-06-29 12:21:46
回答 3查看 2.5K关注 0票数 7

对于任意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中的代码如下:

代码语言:javascript
复制
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)来说仍然不够快。有人能告诉我是什么使我的代码变慢或者如何使它更快吗?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-29 12:42:53

mul可以变得非常大。这有必要吗?如果我让你手工计算127834857293484728485612787487189900038* 38758的最后5个非零位数,你到底需要知道第一个数字的数字是多少?

票数 7
EN

Stack Overflow用户

发布于 2010-06-29 12:28:12

经常构建字符串是很昂贵的。当截断到最后五位数时,我宁愿使用模运算符。

代码语言:javascript
复制
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

这同样适用于去掉尾随零。应该有一种更有效的方法来做到这一点,而且您可能不必在每一个步骤中都这样做。

不过,我没有检查您的算法是否正确,这只是一个优化的提示。

票数 2
EN

Stack Overflow用户

发布于 2010-06-29 15:02:18

实际上,您甚至可能会注意到,只有一组有限的可能尾随非零位数。如果我没记错的话,只有几千种可能的尾随非零数字组合,当你只看最后5位时。例如,最终的非零数字有可能是奇数吗?(忽略0的特殊情况!)还有1!在这里)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3140533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档