素数筛法: 对于到sqrt(max)为止的所有数:如果是质数,则把它的所有倍数都标记为合数;如果是合数,则直接遍历下一个数。

#include <iostream>
#include <string>
using namespace std;

//例题6.8 素数
int main(){
    int nums[10000];//0-9999
    for(int i=2;i<10000;i++){
        nums[i]=0;//默认:0-质数
    }
    for(int i=2;i<=100;i++){
        if(nums[i]==0)//如果是质数
            for(int j=2;i*j<10000;j++)
                nums[i*j]=1;
    }
    int x;
    while(scanf("%d",&x)!=EOF){
      int flag=0;
      for(int i=2;i<x;i++)
          if ((i%10==1)&&(nums[i]==0)){
              flag=1;
              printf("%d ",i);
          }
      if(flag==0)printf("-1");
      printf("\n");
    }
    return 0;
}