原题是这样:
给定一个整数N ,那么N 的阶乘N !末尾有多少个0呢?例如:N =10,N !=3 628 800,N !的末尾有两个0。
初看这样的题目可能会想到直接求出N!的阶乘,然后再计算出0的个数。显然用这种方法如果N很大的情况下,非常容易溢出。所以我们可以换个角度来分析这个问题。
N!=1×2×3×4×5×6×··· ×N
我们可以对N!进行分解质因数 即
N!=2x ×3y ×5z ··········
可以看到2和5相乘必然会产生一个10,而这个10会在阶乘的末尾添加一个0。那么问题就转化为2x ×5z 可以产生多少个0,即min(x,z),显然X肯定大于Z(能被2整除的数肯定比5多),最终问题转化为求Z的值-即找出1...N能分解出多少个5, 程序如下:
- int countFactorialZero(int N) {
- int ret = 0, i, j;
- for(i = 1; i <= N; i++)
- {
- j = i;
- while(j % 5 ==0)
- {
- ret++;
- j /= 5;
- }
- }
- return ret;
- }
int countFactorialZero(int N) { int ret = 0, i, j; for(i = 1; i <= N; i++) { j = i; while(j % 5 ==0) { ret++; j /= 5; } } return ret; }