给定一个整数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!=2^x ×3^y ×5^z ··········
可以看到2和5相乘必然会产生一个10,而这个10会在阶乘的末尾添加一个0。那么问题就转化为2^x ×5^z 可以产生多少个0,即min(x,z),显然X肯定大于Z(能被2整除的数肯定比5多),最终问题转化为求Z的值-即找出1…N能分解出多少个5, 程序如下:
int FactorialZero(int n)
{
int num = 0,i,j;
for (i = 1; i <= n; i++)
{
j = i;
while (j % 5 == 0)
{
num++;
j /= 5;
}
}
return num;
}