百練 11:迴文素數

總時間限制: 
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位數,那麼就循環了數千萬次。。。我太天真了。

大佬的AC,點擊

PS :通過構造迴文數,而不是去判斷是不是迴文數。n爲偶數時,既是迴文數又是素數的不存在的。爲什麼呢?簡單證明。

求一億以內的迴文素數。

學習了學習了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章