您的位置:首页 > 其它

杭电1431 回文素数 (数论)

2015-12-24 13:10 218 查看


素数回文

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 15918 Accepted Submission(s): 3534



Problem Description

xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);



Input

这里有许多组数据,每组包括两组数据a跟b。



Output

对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。



Sample Input

5 500




Sample Output

5
7
11
101
131
151
181
191
313
353
373
383




Author

xiaoou333

其实这个题还是蛮坑的题目,题目中的数据范围直接吓死宝宝了,参考了大牛的代码,学会了思维。这里详解一下。

首先这个题目是要判断回文素数,表示这个数是回文数,也是素数,我直接想到的是打印素数表,但是好像数据范围有点大,数组绝壁会MLE.然后就默默的用这样的方法来判断是否为素数:

int isprime(int a)
{
    int i;
    for(i=2;i*i<=a;i++)
        if(a%i==0)return 0;
        return 1;
}


然后就是判断回文数,既然是回文数,回文回文,我们回一个不就行了》?

所谓回文数,可以利用其对称性来判断是否为回文数,当然也可以用整个数倒过来的方式判断 ,这里给出实例:

121 倒过来还是121.但是如果是321倒过来是123就不是回文数,所以这里我们利用特性,来判断是否为回文数。

int huiwen(int a)
{
    int i=a,s=0;
    while(i)
    {
        s=s*10+i%10;
        i/=10;
    }
    if(a==s)return 1;
    return 0;
}


然后就是漫长的TLE过程,看了大牛的代码,知道在5 1000000000的范围内最大的回文素数是9989899.如果范围确定了之后,就不会超时了,这里范围的确定是如何判断的呢?这个就是个思维的问题了,在你的控制框中输入这样的一个数据:5 1000000000,然后发现,输出到9989899之前都是很畅通的在输出,但是输出了9989899之后,就没有数字输出了,而且程序还在跑,这个时候就判断出来你超时了。但是如果你把这个9989899定为最大回文素数的时候,程序跑到这个数就不会继续跑了。这也是一种打表思维。无论作为读者的你有没有学到东西,我是学到了。

这里上AC完整代码:

#include <iostream>
#include<stdio.h>
using namespace std;
int isprime(int a) { int i; for(i=2;i*i<=a;i++) if(a%i==0)return 0; return 1; }
int huiwen(int a) { int i=a,s=0; while(i) { s=s*10+i%10; i/=10; } if(a==s)return 1; return 0; }
int main (void)
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
for(int i=a;i<=b&&i<=9989899;i++)
if(huiwen(i)&&isprime(i))printf("%d\n",i);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: