埃氏筛法(比线性筛法慢一点):
const int N=1e5;
int pri[N],cnt;
bool st[N];
void screen(int n)
{
st[1]=true;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
pri[cnt++]=i;
for(int j=i+i;j<=n;j+=i)
st[j]=true;
}
}
}
线性筛法:
const int N=1e5;
int pri[N],cnt;
bool st[N];
void screen(int n)
{
st[1]=true;
for(int i=2;i<=n;i++)
{
if(!st[i])
pri[cnt++]=i;
//不用加 j<cnt,因为如果i是合数一定可以在cnt之前停下来
// 如果i是质数那么pri[j]=i时也能停下来
for(int j=0;pri[j]<=n/i;j++)
{
st[pri[j]*i]=true;
if(i%pri[j]==0)//pri[j]一定是i的最小质因子
break;
}
}
}