https://www.luogu.org/problemnew/show/P1217
题目描述
因为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
题解:直接暴力求解。有两种思路。
1、求出所有质数,然后在区间内挑选符合的回文数。使用筛法,但是比较容易TLE。
2、其实原题目也给了提示hint了,可以先构造出回文数,然后在判断回文数是否为质数。
这里我们就暴力使用第二种思路。
代码如下:
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
int prime[100000005];
int isPrime(int x)
{
if(x==0||x==1) return 0;
if(x==2) return 1;
for(int i=2;i*i<=x;++i)
if(x%i==0) return 0;
return 1;
}
int main()
{
int a,b,num,cnt;
cnt = 0;
cin>>a>>b;
for(int i=2;i<=9;++i)
if(isPrime(i))
prime[++cnt] = i;
prime[++cnt] = 11;//十位数区间只有11是质数
for(int i=1;i<=9;i+=2)//质数的个位数必然不是偶数
{
if(i==5)continue;//任何个位数为5的整数必然会被5整除
for(int j=0;j<=9;j++)
{
num = i*100 + j*10 + i; //构建回文数,以下循环都是
if(isPrime(num)) prime[++cnt] = num;
}
}
for(int i=1;i<=9;i+=2)
{
if(i==5)continue;
for(int j=0;j<=9;j++)
{
num = i*1000 + j*100 + j*10 + i;
if(isPrime(num)) prime[++cnt] = num;
}
}
for(int i=1;i<=9;i+=2)
{
if(i==5)continue;
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
{
num = i*10000 + j*1000 + k*100 + j*10 + i;
if(isPrime(num)) prime[++cnt] = num;
}
}
for(int i=1;i<=9;i+=2)
{
if(i==5)continue;
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
{
num = i*100000 + j*10000 + k*1000 +k*100 + j*10 + i;
if(isPrime(num)) prime[++cnt] = num;
}
}
for(int i=1;i<=9;i+=2)
{
if(i==5)continue;
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
for(int l=0;l<=9;l++)
{
num = i*1000000 + j*100000 + k*10000 + l*1000 +k*100 + j*10 + i;
if(isPrime(num)) prime[++cnt] = num;
}
}
for(int i=1;i<=9;i+=2)
{
if(i==5)continue;
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
for(int l=0;l<=9;l++)
{
num = i*10000000 + j*1000000 + k*100000 + l*10000 +l*1000 +k*100 + j*10 + i;
if(isPrime(num)) prime[++cnt] = num;
}
}
int start = 1;
while(prime[start]<a)//在回文数数组中找符合区间要求的第一个数
{
start++;
}
while(prime[start]<=b)
{
if(start > cnt)//防止数组越界
break;
cout<<prime[start]<<endl;
start++;
}
return 0;
}