算法笔记练习 5.4 素数 问题 A: 素数
题目
题目描述
输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。
输入
输入有多组数据。
每组一行,输入n。
输出
输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
样例输入
70
样例输出
11 31 41 61
思路
用埃氏筛法打素数表,但只将个位为 1 的素数放入表中。
细节:特判输出-1
的情况。
代码
#include <stdio.h>
#define MAX 10010
int table[MAX/2];
int isPrime[MAX];
// 打素数表,只将个位为 1 的素数放入 table
int findPrime(void) {
int i, j, cnt = 0;
for (i = 2; i < MAX; ++i)
isPrime[i] = 1;
for (i = 2; i < MAX; ++i) {
if (isPrime[i]) {
if (i % 10 == 1)
table[cnt++] = i;
for (j = i; j < MAX; j += i)
isPrime[j] = 0;
}
}
return cnt;
}
int main() {
int n, i, cnt;
cnt = findPrime();
while (scanf("%d", &n) != EOF) {
if (n < 11) {
printf("-1\n");
continue;
}
int flag = 0;
for (i = 0; i < cnt; ++i) {
if (table[i] >= n)
break;
if (flag)
putchar(' ');
flag = 1;
printf("%d", table[i]);
}
putchar('\n');
}
return 0;
}