算法学习十七----计算n的阶乘中0的个数

题目:给定一个整数n,那么n的阶乘n!末尾有多少个0呢?例如:n=10,n!=362800,n!的末尾有两个0
如果直接计算出n的阶乘再判断的话不仅耗时而且还会有溢出的情况。
首先考虑N!=K*10^M且K不能被10整除,那么就可以知道N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于1-=2*5,所以M只与X和Z有关,每一对2和5就能得到一个10,所以M=Min(X,Z)。不难看出X>Z,因为能被2整除的数比能被5整除的数多得是,所以得出M=Z
所以算法转化为计算1-n的因式分解中5的个数

算法伪代码如下

int Factorialn(int num)


for i <- 1 to num
     j=i
     while(j%5 == 0)
          ++count

          j /= 5;

return count;

C++实现

int Factorialn(int num)
{
    int j = 0, count = 0;
    //for i <- 1 to num
    for(int i = 1; i <= num; ++i)
    {
        //j=i
        j=i;
        //while(j%5 == 0)
        while(j%5 == 0)
        {
            //++count
            ++count;

            //num/=5
            j /= 5;
        }
    }

    return count;
}


你可能感兴趣的:(算法)