hdu 1431 素数回文(打表)

来源:互联网 发布:狗语翻译器软件 编辑:程序博客网 时间:2024/05/17 22:04

素数回文
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15431 Accepted Submission(s): 3442

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
分析:这个题我还就真得呵呵一下出题人了,数组一定要开到99899900,因为最后一个回文素数就是99899899;如果你开到100000000,那就超内存没商量,用位域表示也是不行,代码如下所示

#include"cstdio"#include"iostream"#include"cstring"#include"cmath"#include"algorithm"using namespace std;const int maxn=9989900;bool used[maxn];int a,b;int yesno(int n){int a[9];int num=1;while(n/10!=0){    a[num]=n%10;    num++;    n=n/10;    if(n<10)        a[num]=n;}int f=1;for(int i=1;i<num;i++){    if(a[i]!=a[num-i+1]){        f=0;        break;    }}  if(f==1)    return 1;    else        return 0;}int main(){    memset(used,0,sizeof(used));for(int i=2;i<sqrt(maxn);i++){    for(int j=i*i;j<maxn;j=j+i){        if(!used[j]){            used[j]=1;        }    }}for(int i=5;i<maxn;i++){    if(!used[i]&&!yesno(i)){        used[i]=1;    }}while(cin>>a>>b){    for(int i=a;i<=b&&i<maxn;i++){        if(!used[i])            cout<<i<<endl;    }    cout<<endl;}}
0 0