题目描述
【描述】 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;
【pprime.in】
第 1 行: 二个整数 a 和 b .
【pprime.out】
输出一个回文质数的列表,一行一个。
SAMPLE INPUT
5 500
SAMPLE OUTPUT
5
7
11
101
131
151
181
191
313
353
373
383
回文质数要想优化时间,首先得先判断回文,之后再判断素数;之后由于回文质数的所有数均为奇数,每次加2判断。这些相信大家都可以从百度搜索到。
下面谈一下我的经验:开始先判断了素数,之后判断回文,发现超时,之后先判断回文,后判断素数,还是超时,后又每次加2判断,发现还是超时。查看了好多篇文章,感觉有些写的不是很好懂,之后发现一篇文章http://www.fx114.net/qa-177-48019.aspx,于是我加了if(n>9989899) n=9989899;后(9989899之后的数可以不用判断),发现不超时了,但是只有不到一半的正确率,后来发现是自己判断失误,如果从偶数开始加二,则没有数输出,后来判断了偶数,提交可以AC,时间为1175,自己发现回文质数除了不是偶数外,也不是3 的倍数,加了判断后,时间为833.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int judge(int i) //判断回文
{
int temp=i,sum=0;
while(i)
{
sum=sum*10+i%10;
i/=10;
}
if(temp==sum)
{
return 1;
}
else
{
return 0;
}
}
int prime(int x) //判断素数
{
int i;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
int main()
{
int m,n,i,j;
scanf("%d %d",&m,&n);
if(n>9989899) n=9989899;
if(m%2==0)m=m+1;
for(i=m;i<=n;i+=2)
{
if(i%3==0)continue;
if(judge(i))
{
if(prime(i))
{
printf("%d\n",i);
}
}
}
return 0;
}
822

被折叠的 条评论
为什么被折叠?



