请教一道编程题(c++)

来源:百度知道 编辑:UC知道 时间:2024/06/03 15:45:58
Description

求N!结尾零的个数,例如,10!=3628800,有2个零

Input

本题有多组测试数据,每组一行,每行只有一个整数N(1<=N<=1000000)

Output

每组测试数据输出一行,表示有几个0

Sample Input

1
5
1000

Sample Output

0
1
249

怎么做啊?

n!末尾有几个0,即有几个10的因子。而10=2×5。对于100!,从1~100所有的整数乘积中,2的因子比5的因子多,因此只要算100!中含有因子5的个数即为含有因子10的个数。在1~100中,含有因子5的数出现了20次,其中有4个数(25,50,75,100)中各含有两个5的因子,因此总共含有因子5的个数为20+4=24。故100!中,尾数含有24个0
有多少个5的倍数就有多少个阶乘末尾零
有多少个25的倍数就再加多少个阶乘末尾零
有多少个625的倍数就再加多少个阶乘末尾零
……

比如5-9有1个
10-14有2个
15-19 3
20-24 4
25-29 5+1=6
因为
5*偶数=阶乘末尾零

对于n,通常解的形式就是:
[n/5]+[n/5*5]+[n/5*5*5]+.....

#include <iostream>

using namespace std;

unsigned long power (int, int);
int FactZero (int);
int main()
{
int n;
while (cin>>n)
{
cout<<FactZero(n)
<<endl;
}
cout<<endl;

return 0;
}

int FactZero (int n)
{
int sum = 0, tmp = 1;
int i = 1;
do
{
tmp = n/power(5,i);
sum += tmp;
i++;
}while (tmp!=0);
return sum;
}
//我自己写的一个高效的乘方函数 你也可以用库函数