【编程之美】读书笔记:给定一个整数N,求N!末尾有多少个0

         问题:给定一个整数N,求N!末尾有多少个0

         这个题目不能直接求出N!的值,这样可能会溢出。首先考虑N!=K*10^M,并且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于10=2*5,所以M只和X和Z有关,每一对2和5相乘都可以得到一个10,于是M=min(X,Z);不能看出X>=Z.所以把公式简化为M=Z,只要计算出Z的值,就可以得到N!末尾0的个数。

 解法一:计算1,2,...,N的因式分解中5的指数,然后求和。
   

 ret=0;
for(i=1;i<=N;i++)
{
j=i;
while(j%5==0)
  {
ret++;
j/=5;
}
}


解法二:公式Z=[N/5]+[N/5^2]+[N/5^3]+...其中[N/5]表示不大于N的数中5的倍数贡献一个5,[N/5^2]表示不大于N的数中5^2的倍

数再贡献一个5. [N/k]表示1,2,3,...,N中能被k整除的数的个数。
代码如下:
 

ret=0;
 while(N)
{
 ret+=N/5;
N/=5;
}


 

你可能感兴趣的:(数据结构与算法)