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

来源:互联网 发布:组成数据的基本单位是 编辑:程序博客网 时间:2024/06/01 10:21
题目:给定一个整数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;}


0 0