题目描述
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;
输入输出格式
输入格式:第 1 行: 二个整数 a 和 b .
输出一个回文质数的列表,一行一个。
如果直接进行枚举,则显然会超时,显然需要进行剪枝。
首先,可以通过试验得到,当回文数的位数是偶数时,可以被11整除,此时将不是质数。
同时,在一段区间内,质数的个数一般是多于回文数的个数,而&&为短路的运算符,可以判断是否为回文后再判断是否为质数。
#include<bits/stdc++.h>
using namespace std;
bool pre(int x)
{
int a[1000];
int i=0;
while (x)
{
a[++i]=x%10; x/=10;
}
//if(i%2==0) return false;
for (int j=1;j<=i/2;j++)
if (a[j]!=a[i-j+1]) return false;
return true;
}
bool prime(int x)
{
if (x==2) return true;
int k=2;
while (k<=sqrt(x)&&x%k!=0) k++;
if (k<=sqrt(x)) return false;
else return true;
}
int main()
{
int a,b;
cin>>a>>b;
for (int i=a;i<=b;i++)
{
if(i>=1000&&i<=9999||i>=100000&&i<=999999||i>=10000000&&i<=99999999) continue;
if( pre(i)&&prime(i)) printf("%d\n",i);
}
return 0;
}