首先考虑,如果N的阶乘为K和10的M次方的乘积,那么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,因为被2整除的频率比被5整除的频率高的多。所以可以把公式简化为M=Z.
由上面的分析可以看出,只要计算出Z的值,就可以得到N!末尾0的个数
就是要计算1-n的因式分解中5的指数。然后求和。
如25的阶乘有6个0,25*24==600,有两个0,
#include<iostream>usingnamespacestd;
int getNum(int n)
{
int num = 0;
int i, j;
for (i = 1; i <= n; i++)
{
j = i;
while (j % 5 == 0)
{
num++;
j /= 5;
}
}
return num;
}
int getNum2(int n)
{
int ret = 0;
while (n)
{
ret += n / 5;
n /= 5;
}
}
int main()
{
int n;
while (cin >> n)
{
cout << getNum(n) << endl;
}
return0;
}