- 總時間限制:
- 5000ms
- 內存限制:
- 65536kB
- 描述
- 一個數如果從左往右讀和從右往左讀數字是相同的,則稱這個數是迴文數,如121,1221,15651都是迴文數。給定位數n,找出所有既是迴文數又是素數的n位十進制數。(注:不考慮超過整型數範圍的情況)。
- 輸入
- 位數n,其中1<=n<=9。
- 輸出
- 第一行輸出滿足條件的素數個數。
第二行按照從小到大的順序輸出所有滿足條件的素數,兩個數之間用一個空格區分。 - 樣例輸入
1
- 樣例輸出
4
2 3 5 7
#include <iostream> #include<algorithm> #include<vector> using namespace std; #include<string> #define m1 pow(10,m-1) bool isPrime(int u){ bool flag=true; for(int i=2;i<sqrt(u)+1;i++){ if(u%i==0){ flag=false;break; } } return flag; } vector<int> vc; int main() { int n; cin>>n; if(n==1){ cout<<"4\n2 3 5 7";return 0; } int x=pow(10,n); for(int i=pow(10,n-1);i<x;i++){ //循環獲取頭部進行比較。 int m=n; int temp=i; bool flag=true; while(m!=1&&m!=0){ int f=temp/m1; int e=temp%10; if(f==e){ temp-=(f*m1); temp-=e; temp/=10; m-=2; }else{ flag=false;break; } } if(flag){ if(isPrime(i)){ vc.push_back(i); } } } cout<<vc.size()<<'\n'; for(vector<int>::iterator it=vc.begin();it!=vc.end();it++){ cout<<*it; if(it!=vc.end()-1) cout<<' '; } return 0; }
//這樣寫提交之後會超時。。。0分。雖然結果正確,但是這樣循環着去判斷肯定不行,如果是9位數,那麼就循環了數千萬次。。。我太天真了。
PS :通過構造迴文數,而不是去判斷是不是迴文數。n爲偶數時,既是迴文數又是素數的不存在的。爲什麼呢?簡單證明。
學習了學習了。