首页 > 代码库 > Factorial Trailing Zeroes(析因,求尾随个0个数)

Factorial Trailing Zeroes(析因,求尾随个0个数)

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

  这是LeetCode Online Judge上的一个原题:给定一个n,求n!中,末尾0的个数。

  • 思路
    1. n!中0的个数,可以将n!表示成 n!=m*10k,其中k就是题目要求的结果。那么,10k是怎么来的呢?很容易想到,10=2*5,那么,10k=(2*5)k;至此,可以简化成,题目求的是2*5的个数
    2. 进一步思考,1*2*3……(n-1)*n,求2*5的个数就是求1-n中2和5的因子总数分别总共有多少个,并且2*5的个数是由min(2个数,5个数)决定的。(1,2,3,4,5……n)每2个数中即最起码有有一个2的因子;而5出现的次数为:每5个中才出现一次5的因子,因此,可以判断,因子5出现的次数远小于因子2。所以此题简化成:求1-n中因子5的个数的总和;

     当到这是,很愉快地解决了为题,洋洋洒洒写到以下代码:

class Solution {public:    int trailingZeroes(int n) {                int count5 = 0;        for(int i=1 ; i<=n ; i++)        {            int temp = i;             while (temp%5 == 0)            {                ++count5;                temp /= 5;            }        }                       return count5;    }};

    在LeetCode上一提交,呀,报错了!!!超时了,Last executed input:1808548329。

    这时候一百度,看到博客园上有人有更简单的方法啦:http://www.cnblogs.com/ganganloveu/p/4193373.html。仔细一看,很有道理呀,但是有点看不懂,再百度一下,好了,问题全解决了,正确的思路应该继续往下想:

 

    3. 1-n中,只有5的倍数,才含有因子5。1-5,6-10,11-15,16-20,21-25……可以看出,1-n中有n/5个数字是5的倍数;但25的倍数的数字至少应该有2个含5的因子(25=5*5);以此类推,125的倍数的数字至少含有3个5的因子……顾而程序可以修改为:

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

    完美解决!!!

    所以,这题留给我们的思考是,看到代码不要直接提笔就写,要多想,多思考,多推算,有很多方法值得借鉴!!!!

 

 

 

    

Factorial Trailing Zeroes(析因,求尾随个0个数)