题目描述
因为 151151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151151 是回文质数。
写一个程序来找出范围[a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。
输入格式
第一行输入两个正整数 a 和 b。
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入
5 500
输出
5 7 11 101 131 151 181 191 313 353 373 383
这道题就是回文判断+素数筛
但是由于数据很大,我们在判断回文的时候需要加速:
当回文数的位数为偶数位时,它都是11的倍数,
也就是说,除开11,其它的偶数位的回文数都不是质数,
这样,我们在遍历的时候就可以加速辣!!!
请看神之一手
#include<bits/stdc++.h>
#define pi 3.14
using namespace std;
//素数筛
bool prime[100000005];
void get(){
memset(prime,true,sizeof(prime));
prime[1]=false;
for(int i=2;i<=sqrt(10000000);i++){
for(int j=2;j<=10000000/i;j++){
prime[i*j]=false;
}
}
}
//回文判断
bool judge(int n){
string s=to_string(n);
if(n==11){
return true;
}
if(n%11==0){
return false;
}
int len=s.length();
for(int i=0;i<len/2;i++){
if(s[i]!=s[len-1-i]){
return false;
}
}
return true;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int l,r;
cin>>l>>r;
get();
if(l%2==0){
l++;
}
for(int i=l;i<=r;i+=2){
string s=to_string(i);
int len=s.length();
if(i==11){
printf("%d\n",i);
}
//神之一手
if(len%2==0){
i=pow(10,len)-1;
}
if(prime[i]&&judge(i)){
printf("%d\n",i);
}
}
return 0;
}