时间复杂度(朴素筛:nloglogn)
线性筛之所以比朴素筛快的原因是:一个数被筛掉,只会被它的最小质因数筛掉,每个数只会被筛一次。
朴素筛:
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int prime[N];
int n,cnt;
bool st[N];
void get_prime(int x)
{
for(int i=2;i<=x;i++)
{
if(!st[i])
{
prime[++cnt]=i;
st[i]=true;
for(int j=i+i;j<=x;j+=i)
st[j]=true;
}
}
}
int main()
{
cin>>n;
get_prime(n);
cout<<cnt<<endl;
}
线性筛:
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int prime[N];
bool st[N];
int cnt;
int n;
void get_prime(int x)
{
for(int i=2;i<=x;i++)
{
if(!st[i]) prime[cnt++]=i;
for(int j=0;prime[j]<=x/i;j++)//,i是质数就筛掉i与primes中所有质数的乘积;i是非质数筛掉i与primes中所有<=最小质因子的乘积
{
st[i*prime[j]]=true;
if(i%prime[j]==0) break;//当遇到i的最小的质因子时就结束
}
}
}
int main()
{
cin>>n;
get_prime(n);
cout<<cnt<<endl;
return 0;
}