4.3 循环结构程序设计案例(3)
例 4-14
回文质数(洛谷P1217,USACO Training)
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 a,b( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
| 输入 | 输出 |
|---|---|
5 500 |
5711101131151181191313353373383 |
解答
#include<iostream>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
if(a<=5 && b>=5)
cout<<5<<endl;
if(a<=7 && b>=7)
cout<<7<<endl;
if(a<=11 && b>=11)
cout<<11<<endl;
if(b>100)
{
for(int i=1;i<=9;i+=2) //个位数为偶数肯定不是质数,所以只查奇数即可
{
for(int j=0;j<=9;j++)
{
int num=i*100+j*10+i;
if(num<a)
continue;
if(num>b)
return 0;
int isZ=1;
for(int z=3;z*z<=num;z++) //因为是奇数,所以从3开始;约数不可能大于num的开平方。
{
if(num%z==0)
{
isZ=0;
break;
}
}
if(isZ)
cout<<num<<endl;
}
}
}
if(b>10000)
{
for(int i=1;i<=9;i+=2)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
int num=i*10000+j*1000+k*100+j*10+i;
if(num<a)
continue;
if(num>b)
return 0;
int isZ=1;
for(int z=3;z*z<=num;z++)
{
if(num%z==0)
{
isZ=0;
break;
}
}
if(isZ)
cout<<num<<endl;
}
}
}
}
if(b>1000000)
{
for(int i=1;i<=9;i+=2)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
for(int l=0;l<=9;l++)
{
int num=i*1000000+j*100000+k*10000+l*1000+k*100+j*10+i;
if(num<a)
continue;
if(num>b)
return 0;
int isZ=1;
for(int z=3;z*z<=num;z++)
{
if(num%z==0)
{
isZ=0;
break;
}
}
if(isZ)
cout<<num<<endl;
}
}
}
}
}
return 0;
}
博主的个人网站:https://codespark.cn/

浙公网安备 33010602011771号