题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例c++
输入
5 500
输出
5 7 11 101 131 151 181 191 313 353 373 383
说明/提示
提示 1: 找出所有的回文数再判断它们是不是质数(素数)
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
#include<iostream>
#include<cstdio>
#define MAXN 10000005
using namespace std;
int prime[MAXN];
bool pp[MAXN];
int vis[MAXN];
bool pd_h(int x)
{
int y=x,num=0;//int y=x,防止x被改变
while (y!=0)
{
num=num*10+y%10;//上一次数字的记录进位再加上下一位数
y/=10;
}
if (num==x) return 1;
else return 0;
}
int main()
{
int a,b;
cin>>a>>b;
int cnt=0;
if(b>10000000) b=10000000;
for(int i=2;i<=b;i++)
{
if(!vis[i]) prime[cnt++]=i,pp[i]=1;
for(int j=0;j<cnt&&i*prime[j]<=b;j++)
{
vis[i*prime[j]]=i;
if(i%prime[j]==0) break;
}
}
for(int i=a;i<=b;i++)
{
if(i>10000000) break;
if(pd_h(i)&&pp[i]) printf("%d\n",i);
}
}