[USACO1.5]回文质数 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
思路
建立两个函数分别判断质数和回文数
质数判断用枚举或埃氏筛选法,回文判断只要将数字倒过来与原数字比较
但是直接交,不管哪个函数先运行,都会吃T(虽然先判断回文整个程序能更快)。因此要投机取巧优化:拥有偶数数位的质数不可能是回文数,所以可以选择直接忽略10^8^到10^9^之间的数,就正好不被TLE
代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int x)
{
if(x<=1) return false;
int sqr=(int)sqrt(1.0*x);
for(int i=2;i<=sqr;i++)
{
if(x%i==0) return false;
}
return true;
}
bool is_Palindromes(int x)
{
int t=x,x1=0;
while (t!=0)
{
x1=x1*10+t%10;
t/=10;
}
if (x1==x) return true;
else return false;
}
int main()
{
int ans=0;
int a,b;
cin>>a>>b;
if(b>10000000) b=10000000;
for(int i=a;i<=b;i++)
{
if(is_Palindromes(i))
{
if(is_Prime(i))
cout<<i<<endl;
}
}
return 0;
}