lintcode2

描述

设计一个算法,计算出n阶乘中尾部零的个数
样例
11! = 39916800,因此应该返回 2
挑战
O(logN)的时间复杂度

解1:

主要求出5的幂次次数,如25的阶乘,有5   2*5  3*5 4*5 5*5   则5的幂次次数为6,即尾部零的个数为6
因为偶数*5就会尾部就可以产生零,而偶数出现的比5出现的次数一定多,比如3!=3*2*1   6!=6*5*4*3*2*1,所以值考虑5出现的次数就好,除此之外还要加上10出现的次数。
class Solution {
public:
    long long trailingZeros(long long n) {
       long long sum = 0;
        for (long long  temp = 5; temp <= n; temp+=5) 
        {
            count++;
            long long pwr = 25;
            // 判断是不是25、125、625...的倍数,并根据每次pwr的变化进行+1操作
            while (temp % pwr == 0)
             {
                count++;
                pwr *= 5;
             }
          }
                return count;
        }
};

解2:

某个数的阶乘(如101),我要提取5,10,15,20,25……100  
即5*(1*2*3*4*5.......*20)
sum=101/5;  //(sum是零的个数和)
而(1*2*3*4*5.......*20)又可以重复上述步骤5*(1*2*3*4)
sum=sum+101/5/5;
long long sum=0;
long long tmp=n/5;
while(tmp!=0)
{
    sum+=tmp;
    tmp/=5;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容