题目描述
因为 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
#include <stdio.h>
#include <math.h>
int sushu (int n)
{
if(n==2) return 1;
if(n%2==0) return 0;//2是唯一的偶素数,这样可以减少运行时间
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0) return 0;
}
return 1;
}
int huiwen (int n)
{
//可以采用以下两种方法
//采用数组,进行数组元素的比较
int a[12];
int flag=1;
while(n>0)
{
a[flag]=n%10;
n/=10;
flag++;
}
for(int i=1;i<=flag/2;i++)
{
if(a[i]!=a[flag-i]) return 0;
}
return 1;
//进行数字反转,绕后将反转数与原数比较
/*
int sum=0;
while(n!=0)
{
sum=sum*10+n%10;
n=n/10;
}
if(sum==n) return 1;
else return 0;
*/
}
int main ()
{
int a,b;
scanf("%d %d",&a,&b);
for(int i=a;i<=b;i++)
{
if(i==9989900) break;//可以通过打表法把最大的回文素数找出来
if(huiwen(i)&&sushu(i))
printf("%d\n",i);
}
}
这道题主要就是要解决TLE(Time Limit Exceeded)超时的问题。
解决超时可以从以下几点入手:
1、判断素数:2是唯一的偶素数,判断素数时可以只验证奇数即可。
2、判断回文数:可以采用数组或者数字反转的两种方法,都不会超时。
3、打表法求出输出数据的范围,这也是解决本题的关键,通过打表可以发现,回文素数最大便是 9989899,因此让main函数中的循环到9989900便跳出循环即可减少很大一部分的运行时间。