问题描述:
给定一个整数n,求出n!末尾有多少个0?
计算公式:
令f(x)表示正整数x末尾所包含0的个数,则有:
当0<n<5时,f(n!)=0;
当n>=5时,f(n!)=k+f(k!) 其中k=n/5(取整).
公式推导:
证明之前先熟悉一个结论。
结论:对于n!,其因式分解中,如果存在一个因子‘5’,那么它必然对应n!末尾的一个'0'。下面证明这个结论。
证明:首先我们知道在乘法中产生0的途径只有2*5得到10,所以有几对2,5就可以得到几个0.下面我们可以将n!分解,n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),a是一个不含因子‘5’的整数。对于序列5,10,15,······,5(k-1),5k,中每一个数都含有因子‘5’,并且在区间(5(k-1),5k) 内总有一个2产生一个0,将上述序列提出一个5得到n!= 5^k * k! * a,其中k!可以递归的得到,其满足结论.
有了上面的结论,我们知道f(n!) 只与5因子个数有关。f(n!) = f(5^k * k! * a) = k + f(k!) = k + f(k!),其中k = n / 5(取整)。
代码一:
#include <stdio.h>
int a(int n)
{
if(n>=0&&n<5)
return 0;
else
return n/5+a(n/5);
}
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%d\n",a(m));
}
return 0;
}
代码二:
#include<stdio.h>
int main()
{
int n,m,sum,k;
scanf("%d",&n);
while(n--)
{
sum=0;
scanf("%d",&m);
k=m;
while(k)
{
sum+=k/5;
k/=5;
}
printf("%d\n",sum);
}
return 0;
}