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;
}