1.埃氏筛法
基本原理:从小到大将每个质数的倍数筛去
若某个数没有被它前面的数筛掉,那么它一定是质数。
原因:它不是前面的2~p-1中任何一个数的倍数,那么它是质数
时间复杂度:n*log(log(n)),接近线性
const int N = 1e6+5;
bool isprime[N];
int prime[N];
int cnt;
void init(int n)
{
isprime[1]=true;
for(int i=2;i<=n;i++)
{
if(!isprime[i])
{
prime[++cnt]=i;
for(int j=i+i;j<=n;j+=i)
isprime[j]=true;
}
}
}
2.线性筛法
基本原理:每个数只会被它最小的质因数筛掉,那么每个数只会被筛一次,所以时间复杂度为o(n)
const int N = 1e6+5;
bool isprime[N];
int prime[N];
int cnt;
void init(int n)
{
isprime[1]=true;
for(int i=2;i<=n;i++)
{
if(!isprime[i])
prime[cnt++]=i;
for(int j=0;prime[j]<=n/i;j++)
{
isprime[prime[j]*i]=true;
if(i%prime[j]==0)
break;
}
}
}