[题解]openjudge-回文素数

提出

オリジナルタイトルチェーン

問題解決のためのアイデア

全体的なアイデアは:最初のnビットを満たす回文数を生成し、それが素数であるか否かを判断します。

詳細:我々は、10 ^の長さを列挙 - 数(N 1)÷2の長さ、この番号の前に(N - 1)÷2 - 1、元の数を回文上に生成された新規の数に。例:私たちは3回文の長さを必要とするが、その後、我々は10から99までの数を列挙したい、です。私たちは、数が10を列挙することを前提としています。その後、101で生成された最後の番号。

ソース

#include <bits/stdc++.h>
using namespace std;
int a[1000010];
const int mod = 7;
inline int make(int tmp){
    int ans = tmp;
    tmp /= 10;
    while(tmp > 0){
        ans = ans * 10 + tmp % 10;
        tmp /= 10;
    }
    return ans;
}
inline bool prime(int k){
    if(k < 2)return false;
    if(k == 2)return true;
    for(int i = 2;i * i <= k;i++){
        if(k % i == 0)return false;
    }
    return true;
}
int main(){
    int n;
    cin>>n;
    if(n % 2 == 0){
        if(n == 2){
            cout<<1<<endl<<11;
            return 0;
        }
        else {
            cout<<0;
            return 0;
        }
    }
    n = (n - 1) / 2; 
    int h = pow(10,n),s = 0;
    for(int i = h;i <= h * 10 - 1;i++){
        int tmp = make(i);
        if(prime(tmp)) a[++s] = tmp;
    }
    cout<<s<<endl;
    for(int i = 1;i <= s;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/czy--blog/p/11741853.html