Leetcode: Factorial Trailing Zeroes

第一天开始刷题,努力脱离小白路线,希望可以坚持!这道题目开始都没有看懂题意,然后努力找翻译,结果就直接看到别人答案了,囧~

题目意思是:求n!的末尾的0的个数;

解法参考http://www.tuicool.com/articles/RZZnQf

大致思路是:

    • 末尾的0是由1*2*3*...*n式子中的"2*5"产生,因此需要判断n!中包含多少个2,5因子;
    • 对n!进行因式分解,判断2的个数和5的个数,其中,2的个数肯定大于5的个数,因此只需要看5的个数,就知道会产生多少个0;
    • 那么如何看n!中因子5的个数呢,首先让我们想下n/5的意思,意思是n前面有多少个包含5的因子,即去除掉包含5的因子;然而,由于某些数字,例如25,125等,包含多个5因子,所以还需要进一步剔除,所以对此依次剔除,这里需要注意的是,虽然n/25其实意味着包含2个5因子,但是由于之前已经计算过n/5,所以只能被算成1次。(不知道解释清楚没有,写博客也算是锻炼这种解说能力吧)
代码如下:

[java]  view plain copy
  1. public class Solution {  
  2.     public int trailingZeroes(int n) {  
  3.         int x=5;  
  4.         int count=0;  
  5.         while(n>=x){  
  6.             count+=n/x;  
  7.             x*=5;  
  8.         }  
  9.         return count;  
  10.     }  
  11. }  
上面解法会出现Time Limit Exceeded错误,因为当n比较大时,计算肯定较为费时,而每次将n=n/5后,计算数值逐渐变小,才能满足题目的计算时限要求。代码如下:

[java]  view plain copy
  1. public class Solution {  
  2.     public int trailingZeroes(int n) {  
  3.         int count=0;  
  4.         while(n>4){  
  5.             count+=n/5;  
  6.             n/=5;  
  7.         }  
  8.         return count;  
  9.     }  
  10. }  
好了,最后庆祝下通过第一题,虽然不是完全依靠自己的脑力活动来的,哈哈,继续努力!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值