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