打表法,一次性记录每个数是否为素数,之后查表即可
#include<stdio.h>
#include<math.h>
#include<string.h>
bool Judge(int n){
if(n<=1) return false;//负数和0、1都是非素数
int max = sqrt((float)n);//算到sqrt(n)即可
for(int i=2;i<=max;i++)
if(n%i==0) return false;
return true;
}
void Example6_8(){//例题6.8 北航 找出所有素数
//反向思考、打表法
//每确定一个素数,就将其倍数都标记为非素数
int n;
int flag[10001];
for(int i=0;i<=10001;i++) flag[i] = 0;
flag[0] = -1;
flag[1] = -1;
for(int i=2;i<=10000;i++){
if(flag[i]!=0) continue;//已经打表了
if(Judge(i)){
flag[i] = 1;//自己是素数
for(int j=2;j*i<=10000;j++){
flag[j*i] = -1;//素数的倍数是合数
}
} else {
flag[i] = -1;
}
}
//打表之后,每次查表即可
while(scanf("%d",&n)!=EOF){
int counter = 0;
for(int i=2;i<n;i++){
if(flag[i]!=1) continue;
if(i%10!=1) continue;
printf("%d ",i);
counter++;
}
if(counter==0) printf("-1\n");
}
}
int main(){
Example6_8();
return 0;
}

京公网安备 11010502036488号