首先,将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();
}
}