第一个是Eratosthenes,原理简单,复杂度是nloglogn,基本够用了
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
const int n=1e6+5;
int a[1000010];
void Eratosthenes_prime()
{
int m=sqrt(n+0.5);
for(int i=2;i<m;i++)
{
if(!a[i])
{
for(int j=i*i;j<n;j+=i)
a[j]=1;
}
}
}
int main()
{
memset(a,0,sizeof a);
Eratosthenes_prime();
for(int i=2;i<100;i++)
if(a[i]==0)cout<<i<<endl;
return 0;
}
第二是欧拉筛法,稍微复杂点,复杂度是n
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=3000001;
int prime[MAXN];//保存素数
bool vis[MAXN];
int Prime(int n)
{
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<n;i++)
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)//关键
break;
}
}
return cnt;//返回小于n的素数的个数
}
int main()
{
memset(vis,0,sizeof vis);
cout<<Prime(MAXN)<<endl;
for(int i=0;i<100;i++)
cout<<prime[i]<<endl;
return 0;
}