滴滴出行:末尾为0的个数

题目链接: 末尾为0的个数

第一种做法:

这道题怎么做?
看 n!有多少个质因子为5,有多个质因子5末尾就有多少个0…

那怎么求出n!?
不需要求出n!,只需要对每一项求5的质因子个数,最后累加就行…

为什么要看有多少个质因子5?
因为只有5*2=10,可以给产生一个0出来…

那为什么要看质因子为5的个数,而不是质因子为2的个数?
因为对于任何一个数的阶乘来说,质因子为2的个数一定大于等于质因子为5的个数,所以只需要考虑5的个数.

为什么质因数分解2的个数大于等于5的个数?
想下素数筛法…

算术基本定理:任何一个大于1的正整数都能唯一分解为有限个质数的乘积。
可以写做,N=p1^c1 * p2^c2 *…pm^cm
其中pi都是质数,且p1<p2<…<pm

#include<iostream>
#include<algorithm> 
#include<cstring> 
using namespace std;
const int maxn = 1e3 +5;
int num[maxn];
int vis[maxn];						//存储质因数为5的个数
void is_prime5();
int main()
{
	int n,ans;
	for(int i=1;i<maxn;i++) num[i]=i;
	memset(vis,0,sizeof(vis));
	is_prime5();
	while(cin>>n)
	{
		ans=0;
		for(int i=1;i<=n;i++)
		{
			if(vis[i]) ans+=vis[i];
		}
		cout<<ans<<endl;
	}	
	return 0;
}
void is_prime5()				//打张表
{
	int cnt,temp;
	for(int i=1;i<maxn;i++)		//求i的质因数为5的个数
	{
		cnt=0;
		temp=num[i];
		if(num[i]%5==0) 
		{
			while(temp%5==0)
			{
				temp/=5;
				cnt++;
			}
		}
		vis[i]=cnt;
	}
}

猜你喜欢

转载自blog.csdn.net/q1122333/article/details/82861741