*HDU1431 素數迴文【素數+迴文】
阿新 • • 發佈:2019-02-01
看似比較簡單的問題,實際上需要一個過程來解決,否則不是時間出問題,就是空間出問題。
首先,需要編寫一個程式,計算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; }