关于素数,最好不要逐个求,直接用类dp的方法直接把100010以内的数先进行初始化,用test数组标记是否已经标记为非素数,这是极好极快的。本题要求筛选特定的结果。
#include<iostream>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
bool test[100010];
int N;
int num;
int P[100010];
//有点像dp一次全部找到!
void isPrime() {
int i = 2;
for(; i < N; i++) {
if(test[i]==false) {
if(i%10==1)
P[num++] = i;
for(int j = i + i; j < N; j+=i) {
test[j] = true;
}
}
}
}
//这个是每个进行检查!判断!
/*int twoPrime() {
int flag = 1;
for(int q = 2; q < N; q++) {
for(int i = 2; i <= (int)sqrt(1.0*q); i++) {
if(q % i == 0) {
flag = 0;
}
}
if(flag) {
if(q%10==1)
P[num++] = q;
}
flag = 1;
}
*/
//
// for(int i =2; i * i <= N; i++) {
// if(N%i!=0) {
// P[num++] = i;
// }
// }
return 0;
}
int main() {
while(~scanf("%d",&N)) {
memset(test,0,sizeof(test));
memset(P,0,sizeof(P));
num = 0;
twoPrime();
for(int i = 0; i < num; i++) {
if(i == num - 1)
printf("%d\n",P[i]);
else if(i != num - 1)
printf("%d ",P[i]);
}
if(num == 0) printf("-1\n");
}
return 0;
}