打表法,一次性记录每个数是否为素数,之后查表即可

#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;
}