码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-28 22:33:19      阅读:223      评论:0      收藏: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个数)

标签:

原文地址:http://www.cnblogs.com/HanEichy/p/4257236.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!