PAT 甲级 1015 Reversible Primes
A reversible prime in any number system is a prime whose “reverse” in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.
Now given any two positive integers N (<105) and D (1<D≤10), you are supposed to tell if N is a reversible prime with radix D.
Input Specification:
The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.
Output Specification:
For each test case, print in one line Yes
if N is a reversible prime with radix D, or No
if not.
Sample Input:
73 10
23 2
23 10
-2
结尾无空行
Sample Output:
Yes
Yes
No
结尾无空行
题意描述:
给你一个十进制数N,然后将N转换到D进制再翻转,将反转后的数字重新转换到十进制数M,问N和M是否都是素数。
解题思路:
根据题意模拟即可。本题主要考查的就是进制转换以及素数判断,都是比较基础的知识点。
难度评测:Normal
AC代码实现:
#include <bits/stdc++.h>
using namespace std;
#define CLR(arr, val) memset(arr, val, sizeof(arr))
const int N = 1e5+5;
int p[N], cnt = 0;
bool vis[N];
void Eular() {
CLR(vis, false);
vis[0] = vis[1] = true;
for(int i = 2; i < N; i++) {
if(!vis[i]) p[cnt++] = i;
for(int j = 0; j < cnt && i * p[j] < N; j++) {
vis[i * p[j]] = true;
if(i % p[j] == 0) break;
}
}
}
int main() {
Eular();
int n, d;
while(cin >> n && n >= 0) {
cin >> d;
vector<int>a;
int x = n;
while(n) {
a.push_back(n % d);
n /= d;
}
int y = 0;
for(auto v : a)
y = y * d + v;
if(!vis[x] && !vis[y]) {
puts("Yes");
}
else {
puts("No");
}
}
}