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

/*
* 找到一个素数,就将它的所有倍数均标记为非素数
* 遍历到一个数时
* 若未被任何小于它的素数标记为非素数,则确定其为素数
* 并标记它的所有倍数为非素数
* 继续遍历下一个数,直到遍历完
* 1不是素数
*/

int main() {
    //先把2~10000的所有素数都算一遍
    int tag[10005];     //标记数组
    int prime[10000];   //质数数组
    int cnt = 0;
    memset(tag, 0, sizeof(tag));
    for (int i = 2; i <= 10000; i++) {
        if (tag[i] == 0) { //还未被标记,是素数
            int bound = 10005 / i;
            for (int j = 2; j <= bound; j++) {
                tag[j * i] = 1;
            } //标记素数的倍数
            prime[cnt] = i;
            cnt++;
        }
    } //最后cnt得到的就是2~10000的素数总数

    //下面根据要求输出结果
    int n;
    while (scanf("%d", &n) != EOF) {
        int k = 0;
        int flag = 0;
        while (prime[k] < n) {
            if (prime[k] % 10 == 1 && prime[k] != 11) {
                printf(" %d", prime[k]);
            } else if (prime[k] == 11) {
                printf("%d", prime[k]);
                flag = 1;
            }
            k++;
        }
        if (!flag) {
            printf("-1");
        }
        printf("\n");
    }
}

预处理是类似问题的关键思想;不用每次都算一遍