暴力枚举——回文质数 Prime Palindromes
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5 ≤ a < b ≤ 100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b 。
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入样例
5 500
输出样例
5
7
11
101
131
151
181
191
313
353
373
383
#include<bits/stdc++.h>
#define maxn 10000005
using namespace std;
int prime[maxn],flag[maxn],tot=0;
bool sifted[maxn];
void PrimeSiftN(int n) // 素数线筛
{
tot=0;
memset(sifted,0,sizeof(sifted));
memset(flag,0,sizeof(flag));
for(int i=2;i<=n;i++){
if(!sifted[i]){
flag[i]=1;
prime[tot++]=i;
}
for(int j=0;j<tot&&i*prime[j]<=n;j++){
sifted[i*prime[j]]=true; // 筛 i 的素数倍
if(i%prime[j]==0){ // 倍数不超过 i 的最小素因子
break;
}
}
}
}
int is_palindrome(int x) // 判断是否为回文数
{
int y=x;
int z=0;
while(y!=0){
z=z*10+y%10;
y/=10;
}
if(x==z){
return 1;
}
else{
return 0;
}
}
int main()
{
int a,b;
cin>>a>>b;
PrimeSiftN(10000000);
for(int i=a;i<=b;i++){
if(i>10000000){
break;
}
if(flag[i]&&is_palindrome(i)){
cout<<i<<endl;
}
}
return 0;
}