参考《算法笔记》
#include<cstdio>
const int maxn = 1000001;
int p[maxn] = {0};
int pNum = 0,prime[maxn];
void Find_Prime(int n){
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[pNum++] = i;
if(pNum>=n) break;
for(int j=i+i;j<maxn;j+=i){
p[j] = true;
}
}
}
}
int main(){
int m,n,cnt = 0;
scanf("%d%d",&m,&n);
Find_Prime(n);
for(int i=m;i<=n;i++){
printf("%d",prime[i-1]);
cnt++;
if(cnt%10!=0&&i<n)
printf(" ");
else printf("\n");
}
return 0;
}
参考飘过的小牛,有一种在O(n)时间复杂度的素数打表,主要的思想是如果一个数m能被比其小的两个数相乘而得,说明这个数不是素数,在之后的判断过程中可以直接跳过;
int n;
const int maxn = 100010;
bool visit[maxn];//判断是否是素数的表
int prime[maxn];// 存放素数的表
void init_prim(){
memset(visit,true,sizeof(visit));
int num = 0;
for(int i=2;i<n;i++){
if(visit[i]==true){
num++;
prime[num] = i;
}
for(int j=1;(j<=num)&&(i*prime[j]<=n);j++){
visit[i*prime[j]] = false;
if(i%prime[j] ==0) break;
}
}
}