杭电1431 回文素数 (数论)

素数回文

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;
}









你可能感兴趣的:(杭电,杭电1431,杭电OJ1431,回文素数)