非筛法思路正解,题解那边丢不上去想看的可以看看。
题解都是举例质数,这里选择举例回文,由于数据最大是100 000 000 ,这里选择举例回文左侧,右侧通过求反得到,那么只要枚举 100000 不到即可。最后判断质数,范围。
实际复杂度只有 sqrt(n)*sqrt(n)=n 左右。
最后只要把回文质数存下来在排个序就好了,实际数量并不多。
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,ans[200005],len;
int trans1(int x){
int sum=0;
while(x!=0){
sum=sum*10+x%10;
x/=10;
}
return sum;
}
int trans2(int x){
int sum=1;
while(x!=0){
sum=sum*10;
x/=10;
}
return sum;
}
bool check(int x){
if(x==1) return false;
if(x<n || x>m) return false;
for(int i=2;i*i<=x;i++) if(x%i==0) return false;
return true;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=100000;i++){
int x1=i*trans2(i)+trans1(i);
int x2=i/10*trans2(i)+trans1(i);
if( check(x1) == true) ans[len++]=x1;
if( check(x2) == true) ans[len++]=x2;
}
sort(ans,ans+len);
for(int i=0;i<len;i++)
cout<<ans[i]<<endl;
return 0;
}