PAT甲級_1015(Reversible Primes)

1015 可逆素數

任何數系的可逆素數是他是素數且它的逆序數字也是素數。例如73是素數,它在十進制中逆序後的37也是素數。
現在給定任意兩個正整數N(<105)和D(1 < D <= 10),你應該找到N是否是以D爲基數的可逆素數。

輸入規範

輸入文件包含多個測試用例。每個用例佔用一行,包含兩個整數N和D。輸入一個N爲負數完成輸入。

輸出規範

對於每個測試用例,如果N是以D爲基數的可逆素數,則在一行中打印Yes,否則打印No。

輸入樣例
73 10
23 2
23 10
-2
輸出樣例
Yes
Yes
No
解題思路

素數判定+進制轉換。
如N = 23,D = 2,先判斷23(N = 23)是否爲素數,然後將23(N = 23)轉換爲2(D = 2)進製爲10111,然後將這個二進制數字逆序爲11101,在轉換爲10進制29,判斷是否爲素數。

AC代碼
#include <iostream>
#include <cstring> 
#include <cmath>
#include <vector>
using namespace std;
const int MAXN = 100005;
bool prime[MAXN];
//素數打表
void is_prime() {   
    memset(prime, true, sizeof(prime));
    prime[0] = prime[1] = false;
    for(int i = 2; i < MAXN; i++) {
        if(prime[i]) {
            for(int j = i + i; j < MAXN; j += i) {
                prime[j] = false;
            }
        }
    }
}
int main() {
    is_prime();
    int n, d;
    while(cin >> n, n >= 0) {
        int x = n;  //臨時保存n
         cin >> d;
        int num = 0;
        vector<int> vt;
        while(x) {  //化爲d進制
            vt.push_back(x % d);
            x /= d;
        }
        //將d進制的各位數字逆序後轉換爲10進制
        for(int i = vt.size() - 1, t = 0; i >= 0; i--, t++) {
            num += vt[i] * (int)pow(d, t);
        }
        if(prime[num] && prime[n]) {    //都爲素數
            cout << "Yes" << endl;
        }else {
            cout << "No" << endl;
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章