埃氏筛 O(nloglogn)
基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。
缺陷 :对于一个合数,有可能被筛多次。例如 30 = 2 * 15 = 3 * 10 = 5*6……如何确保每个合数只被筛选一次?要用它的最小质因子来筛选,即欧拉筛。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int prime[maxn];
int cnt;
bool vis[maxn];
void get_primes(int n)
{
memset(vis,false,sizeof(vis));
for(int i=2;i<=n;i++)
{
if(vis[i]==false)
{
prime[cnt++]=i;
for(int j=i;j<=n;j+=i)
{
vis[j]=true;
}
}
}
}
int main()
{
int x;
cin>>x;
get_primes(x);
cout<<cnt<<endl;
for(int i=0;i<cnt;i++)
{
printf("prime=%d\n",prime[i]);
}
return 0;
}
线性筛(欧拉筛) O(n) n = 1e7的时候基本就比埃式筛法快一倍了