Leetcode: Factorial Trailing Zeroes

来源:互联网 发布:java开发者 编辑:程序博客网 时间:2024/05/11 01:46

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

题目意思是:求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 plaincopy
  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 plaincopy
  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
原创粉丝点击