您的位置:首页 > 其它

hdu 1431 素数回文(打表)

2015-08-20 16:53 591 查看
素数回文

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: