题目描述
因为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 亿以内的回文质数,7 位就足以将回文数构造出来,然后再判断素数即可
源代码
#include<iostream>
#include<cmath>
using namespace std;
int judge_prime(int n)//判断是否是素数
{
int i;
if(n%2==0) return 0;
for(i=3;i<sqrt(n)+1;i+=2)
if(n%i==0)
return 0;
return 1;
}
int lengh(int n)//判断区间长度
{
int len=1;
while(n>9)
{
n/=10;
len++;
}
return len;
}
int main()
{
int a,b;
int len_a,len_b;
int m,n,p,q;
int number;
int judge_prime(int n);
int lengh(int n);
cin>>a>>b;
len_a=lengh(a);
len_b=lengh(b);
if(len_a<=1&&len_b>=1)//位数为1位时
{
if(a<=5&&b>=5)
cout<<5<<endl;
if(a<=7&&b>=7)
cout<<7<<endl;
}
if(len_a<=2&&len_b>=2)//位数为2位时
{
if(a<=11&&b>=11)
cout<<11<<endl;
}
if(len_a<=3&&len_b>=3)//位数为3位时
{
for(m=1;m<=9;m+=2)
{
for(n=0;n<=9;n++)
{
number=m*100+n*10+m;
if(number<a)
continue;
if(number>b)
break;
if(judge_prime(number))
cout<<number<<endl;
}
}
}
if(len_a<=5&&len_b>=5)//位数为5位时
{
for(m=1;m<=9;m+=2)
{
for(n=0;n<=9;n++)
{
for(p=0;p<=9;p++)
{
number=m*10000+n*1000+p*100+n*10+m;
if(number<a)
continue;
if(number>b)
break;
if(judge_prime(number))
cout<<number<<endl;
}
}
}
}
if(len_a<=7&&len_b>=7)//位数为7位时
{
for(m=1;m<=9;m+=2)
{
for(n=0;n<=9;n++)
{
for(p=0;p<=9;p++)
{
for(q=0;q<=9;q++)
{
number=m*1000000+n*100000+p*10000+q*1000+p*100+n*10+m;
if(number<a)
continue;
if(number>b)
break;
if(judge_prime(number))
cout<<number<<endl;
}
}
}
}
}
return 0;
}