题目链接:https://www.acwing.com/problem/content/199/
思路:就是先判断出2到n的质数有哪些,并且保存一个primes数组(从0开始)来保存这些质数,再用一个bool型数组,在遇到不是质数的数时,把这一位的bool值换成true。
i%primes[j]==0 , 这一个条件的意思是说,我现在还没有比i大的primes【j】,当i和primes【j】相等或者i是primes【j】倍数的时候,会结束这个语句,如果不结束的话就会出现下图的情况,无限循环
而且就是在倍数break情况下,后面的st【】改的是重复的,所以不用担心。
然后就可以把所有的质数挑出来了。
关键:
挑出来所有的质数之后,从n遍历,设一个变量来储存这个质数在n!存在多少,视频讲解可见:
https://www.acwing.com/video/78/(非本人)
代码:
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e6+10;
int primes[N],cnt;
int st[N];
void get_prime(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++]=i;
cout << "i = " << i << " cnt is " <<cnt << " primes[cnt] is " << primes[cnt-1] << endl ;
}
for(int j=0;primes[j]*i<=n;j++)
{
st[primes[j]*i]=true;
cout << "j = " << j << " primes[j] is " << primes[j] << " i is " << i <<endl ;
cout << "primes[j]*i is "<<primes[j]*i <<endl ;
if(i%primes[j]==0) break;
}
}
}
int main()
{
int n;
cin>>n;
get_prime(n);
int p,s=0;
for(int i=0;i<cnt;i++)
{
s=0;
p=primes[i];
for(int j=n;j;j/=p)
{
cout << "j = " << j << " p = " << p <<endl ;
s+=j/p;
cout << "s = " <<s <<endl ;
}
cout<<p<<' '<<s<<endl;
}
return 0;
}