http://acm.hdu.edu.cn/showproblem.php?pid=1431
看似比较简单的问题,实际上需要一个过程来解决,否则不是时间出问题,就是空间出问题。
首先,需要编写一个程序,计算1到100000000之间的回文素数,得到两个值。一是这个区间的最大回文素数是9989899,二是这个区间的回文素数个数是780个。
因此,在定义数组空间时,就可以取一个合适的数值,避免空间超出限制范围。同时可以节省存储空间,加快程序运行速度。
另外,使用布尔数组作为素数筛选标志也可以大量节省存储。
算法策略上,先行筛选素数再判定是否是回文数,时间上比较好一点,逻辑上也比较顺。
#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
#include<string>
#include<sstream>
#define ll long long unsigned
using namespace std;
bool a[9989900];
bool ifsu(int x){
if(x<=1)return false;
for(int i=2;i*i<=x;i++){
if(x%i==0)return false;
}
a[x]=true;
return true;
}
bool ifhuiwen(int x){
int t=x;
int y=0;
while(t){
y*=10;
y+=t%10;
t/=10;
}
return x==y;
}
int main(){
for(ll i=2;i<=9989899;i++){
// if(ifsu(i)&&ifhuiwen(i))cout<<i<<endl;
if(a[i]==false){
// cout<<i<<endl;
for(ll j=i*i;j<=9989899;j+=i){
a[j]=true;
}
}
}
int x,y;
while(cin>>x>>y){
for(int i=x;i<=y&&i<=9989899;i++){
if(!a[i]&&ifhuiwen(i)){
cout<<i<<endl;
}
}
cout<<endl;
}
return 0;
}