leetcode[172] Factorial Trailing Zeroes

Given an integer n, return the number of trailing zeroes in n!.

给定n,求n!的末尾有几个零。

能组成零的末尾的莫过于2*5,和本身就是0结尾的,如10,20,。。。可以注意到以0结尾的也是可以分解成2*5的,所以目标就转化为求几个2*5因子了,又注意到,明显的5的因子个数比2的个数要少,例如n为6的时候只有一个5,但是仅仅4中就有两个2了。所以又转化为求5的个数就行了。

因为5是每隔5出现一次,所以n除以5就是总共有几个含5的因子数了?是吗,其实25中有两个5,这样的话只算了一个5,还有一个漏掉了。

所以你还要除以25,计算有几个25,依次类推还要125,625,。。。,知道5^k > n 为止。

注意到 n/25 = n/5 /5, n/125 = n/25 /5,..., 所以我们可以每次都用/5,只是将n的值每次/5赋值就可。

class Solution {
public:
    int trailingZeroes(int n) {
        int cnt = 0;
        while(n > 4){
            cnt += n / 5;
            n /= 5; 
        }
        return cnt;
    }
};    

 

posted on 2015-01-14 10:07  higerzhang  阅读(245)  评论(0编辑  收藏  举报