题目链接: 末尾为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;
}
}