1. 程式人生 > >*HDU1431 素數迴文【素數+迴文】

*HDU1431 素數迴文【素數+迴文】

看似比較簡單的問題,實際上需要一個過程來解決,否則不是時間出問題,就是空間出問題。

首先,需要編寫一個程式,計算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;
}