末尾0的个数

输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2


输入描述:


输入为一行,n(1 ≤ n ≤ 1000)
输出描述:


输出一个整数,即题目所求
输入例子:


10
输出例子:


2


分析与解法:
刚看到这个题目,也许你想计算出N!的值,那样的话,时间会很长,结果也会溢出。

首先考虑,如果N!=K*10^M,且K不能被10整除,那么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;


#include 

int fun(int n)
{
	int cnt = 0;
	while (n >= 5 && n % 5 == 0)
	{
		cnt++;
		n = n / 5;	
	}
	return cnt;
}

int main()
{
	int n;
	scanf("%d",&n);

	int sum = 0;
	for (int i = 5; i <= n; i += 5)
		sum += fun(i);
	printf("%d\n",sum);
	return 0;
}



你可能感兴趣的:(编程基础)