首先,將2到n範圍內的所有整數記下來,其中最小的數字2爲素數。在表中將2的倍數劃去,表中剩下最小的數爲3,不能被更小的整除,然後將3的倍數劃去。
如果表中剩下的最小數爲m,m是素數,然後將表中所有m的倍數都劃去。像這樣反覆的操作,就能依次枚舉n以內的素數了。
複雜度:nloglogn
代碼實現:
#include<iostream>#include<string.h>
using namespace std;
#define MAX_N 100000
bool is_prime[MAX_N];
int prime[MAX_N];
int num;
int sieve(int n)
{
num=0;
for(int i=1;i<=n;i++)
is_prime[i]=true;
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=n;i++){
if(is_prime[i])
{
prime[num++]=i;
for(int j=2*i;j<=n;j+=i)
is_prime[j]=false;
}
}
return num;
}
void printf()
{
for(int i=0;i<num;i++)
cout<<prime[i]<<" ";
cout<<endl;
}
int main()
{
int N;
while(cin>>N)
{
memset(prime,0,sizeof(prime));
cout<<sieve(N)<<endl;
printf();
}
}