题目描述
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;
输入输出格式
输入格式:
第 1 行: 二个整数 a 和 b .
输出格式:
输出一个回文质数的列表,一行一个。
输入输出样例
输入样例#1:
5 500
输出样例#1:
5 7 11 101 131 151 181 191 313 353 373 383
先把素数打表,这样直接调用就不会超时,再判断回文,加上几次特判,记得上学期做这个题当时怎么优化都是超时,最后打表输出的,那个时候不知道质数打表,是输出每一个数都进行了是否是素数的判断。
AC代码:
#include<iostream>
#include<stdio.h>
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
bool prim[100000001];
void prime(int b)
{
memset(prim,true,sizeof(prim));
prim[1]=false;
int n=sqrt(b);
for(int i=2; i<=n; i++)
{
if(prim[i])
{
for (int j=2; j<=b/i; j++)
prim[i*j]=false;
}
}
}
//判断回文数
bool huiwen(int x)
{
int y=x;
int z=0;
while(y!=0)
{
z=z*10+y%10;
y/=10;
}
if(z==x)
return true;
else
return false;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
if(m>=10000000)
m=9999999;
prime(m);
if(n>m)
return 0;
if(n%2==0)
n++;//从奇数开始
for(int i=n;i<=m;i+=2)
{
if(prim[i]&&huiwen(i))
printf("%d\n",i);
}
return 0;
}