题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5 <=a < b <= 100,000,000)a,b( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入
5 500
输出
5
7
11
101
131
151
181
191
313
353
373
383
解题要点:1:偶数位回文数不可能为质数(除11外),因为他们都是11的倍数,额也没仔细想为啥,直接用。题意给的范围上限降为1e7,不降会TLE。2:偶数(除2外)不可能为质数,降运算次数,不然会TLE。3:判断回文数和埃式筛法。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
bool number[maxn];
int a,b,prime[maxn];
bool hws(int x)
{
int y=x,num=0;
while(y!=0)
{
num=num*10+y%10;
y/=10;
}
if(num==x)
return 1;
else
return 0;
}
void IsPrime()
{
int i,j,c=0;
memset(number,true,sizeof(number));
for(i=2;i<=maxn;i++)
{
if(number[i])
prime[c++]=i;
for(j=0;j<c&&prime[j]*i<=maxn;j++)
{
number[prime[j]*i]=false;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
cin>>a>>b;
IsPrime();
if(b>=10000000)
b=10000000;
for(int i=a;i<=b;i+=2)
{
if(i%2==0&&i==a)
i++;
if(number[i]&&hws(i))
cout<<i<<endl;
}
return 0;
}