这里由于多次判断一个大整数是否是素数,先打表会快很多。
#include<bits/stdc++.h>
using namespace std;
int n,ans=0,pp[10000000],prime[100000],pNum;
bool num[100000];
void find_prime(int x){
for(int i=2;i<x;i++){
if(num[i]==false) prime[pNum++]=i;
for(int j=i+i;j<x;j+=i) num[j]=true;
}
}
bool isPrime(int x) {
if(x<=1) return false;
int t=sqrt(x);
for(int i=0; i<=pNum&&prime[i]<=t; i++) if(x%prime[i]==0) return false;
return true;
}
int main() {
scanf("%d",&n);
find_prime(100000);
if(n==1) {
for(int i=2; i<10; i++) if(isPrime(i)) pp[ans++]=i;
}
else if(n%2==0) {
for(int i=pow(10,n/2-1); i<pow(10,n/2); i++) {
string s1=to_string(i),s2=to_string(i),s;
reverse(s2.begin(),s2.end());
s=s1+s2;
int t=stoi(s);
if(isPrime(t)) pp[ans++]=t;
}
}
else {
for(int i=pow(10,n/2-1); i<pow(10,n/2); i++) {
string s1=to_string(i),s2=to_string(i),s;
reverse(s2.begin(),s2.end());
for(int i=0; i<10; i++) {
s=s1+to_string(i)+s2;
int t=stoi(s);
if(isPrime(t)) pp[ans++]=t;
}
}
}
printf("%d\n",ans);
for(int i=0; i<ans; i++) printf("%d ",pp[i]);
return 0;
}