因为 151151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151151 是回文质数。
写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。
输入格式
第一行输入两个正整数 a 和 b。
输出格式
输出一个回文质数的列表,一行一个。
#include<stdio.h>
#include<math.h>
int pr (int n)
{
int j;
for(j=3;j<=sqrt(n);j++) //sqrt 是确认是否为质数的一种优化
{ //记得加上math.h
if(n%j==0)
return 0;
}
return 1;
}
int pa (int n)
{
int m=0,k=n;
while(k!=0)
{
m=m*10;
m+=k%10; //逆位 反过来 如果n=123则m=321 若不懂则见专栏中的数字反转
k=k/10;
}
if(m==n)
return 1;
else
return 0;
}
int main() //这道题数据太大,必须要想办法优化
{
int a,b,i;
scanf("%d %d",&a,&b);
if(a%2==0) //除2外的偶数不可能是质数,题目的取值范围为[5,]
a++; // 所以如果a是偶数,直接让它变奇数 *第一个优化
if(b>=10000000) //abcddcba 偶数个回文可以被11整除,那必不是质数
b=10000000; //a*10000001+b*1000010+c*100100+d*11000 *第二个优化
for(i=a;i<=b;i+=2) //数除2外不可能是质数,所以直接i+=2让数全部为奇数
{
if(pa(i)&&pr(i)) //pa函数判断回文,pr函数判断质数
printf("%d\n",i);
}
return 0;
}