leetcode 每日一题 172. Factorial Trailing Zeroes
2016-04-01 18:41
459 查看
典型的数学问题:
问题:N的阶乘(N!)中的末尾有多少个0?
例如:N = 5,N! = 120.末尾有1个0.
分析:想到这个问题,有人可能第一反应就是现求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。
其实可以考虑为,哪些数相乘可以得到10 这个角度,由于2*5为十,且分解后5的个数肯定小于2,所以在这个阶乘中10的幂M可以由1~N中有多少个5来决定
因此转换为求问题:1-N中有多少个5?
一开始用的笨方法是,从1~N中直接求每个数的5的指数,但是超时
后来发现,求5的指数,肯定是5,25,125这些数,因此可以用这个公式来求:
Z = N/5 + N /(5*5) + N/(5*5*5).....知道N/(5的K次方)等于0
公式中 N/5表示不大于N的数中能被5整除的数贡献一个5,N/(5*5)表示不大于N的数中能被25整除的数再共享一个5
问题:N的阶乘(N!)中的末尾有多少个0?
例如:N = 5,N! = 120.末尾有1个0.
分析:想到这个问题,有人可能第一反应就是现求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。
其实可以考虑为,哪些数相乘可以得到10 这个角度,由于2*5为十,且分解后5的个数肯定小于2,所以在这个阶乘中10的幂M可以由1~N中有多少个5来决定
因此转换为求问题:1-N中有多少个5?
一开始用的笨方法是,从1~N中直接求每个数的5的指数,但是超时
int trailingZeroes(int n) { int zero=0; long long int i,j; if(n<5) return 0; for(i=5;i<=n;i+=5){ //此处优化,i+=5 j=i; //j要替代i 不然i的值就变了 while(j!=0){ if(j%5==0){ zero++; } j=j/5; } } return zero; } //此方法超时
后来发现,求5的指数,肯定是5,25,125这些数,因此可以用这个公式来求:
Z = N/5 + N /(5*5) + N/(5*5*5).....知道N/(5的K次方)等于0
公式中 N/5表示不大于N的数中能被5整除的数贡献一个5,N/(5*5)表示不大于N的数中能被25整除的数再共享一个5
class Solution { public: int trailingZeroes(int n) { int zero=0; while(n!=0){ zero+=n/5; n=n/5; } return zero; } };更直观的代码在discuss中也有: https://leetcode.com/discuss/89805/sharing-my-4ms-c-solution
class Solution { public: int trailingZeroes(int n) { int result=0; long long int i; for(i=5; i<=n; i=i*5) result += n/i; return result; } };
相关文章推荐
- tail -F查看线上日志
- Run-Time Check Failure #0 错误
- leetcode 70. Climbing Stairs
- 【HDU】 1023 Train Problem II
- 解决maillog文件删除后无法重建的问题
- opencv_traincascade问题
- AIDL的Binder框架
- 出现( linker command failed with exit code 1)错误总结
- 【HDU】 1022 Train Problem I
- 手动执行failover
- 朴素贝叶斯(naive bayes)
- SendMail发邮件
- RAID技术介绍和总结
- kail新手安装
- 【HDU】 1021 Fibonacci Again
- 游戏AI之行为树(中)
- 游戏AI之行为树(上)
- 游戏AI之行为树(下)
- 错误 -- Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
- hdu 1787 GCD Again