问题:给定一个整数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;
- }