可逆的素数是反转过来仍然是素数。例如在十进制中,73是素数,反转过来,37仍然是素数。
现在给定两个正整数 N 和 D,你要告知 在D进制下 N 是否是一个反转素数。
INPUT
输入文件包含一些用例。每个用例占据一行,包含两个正整数 N 和 D。当输入负数N的时候结束输入
OUTPUT
对于每个用例,如果N在D进制下是素数的时候打印 Yes,如果不是的话就打印 No
题目大意:
给出一个D进制下的数N,如果这个数N本身是素数,并且,它在D进制反转过来之后转换成十进制仍为素数,那么就输出 Yes
例:N=23,D=2,N的二进制形式为10111,N反转过来之后为11101,转换成十进制就是 29,也是素数,所以输出 “Yes”
思路:
①本身判断
②进制转换:十进制转换成D进制,再把D进制转换成十进制,判断是否素数
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
bool isPrime(int n) {
if (n <= 1)
return false;
int sqr = (int)sqrt(1.0 * n);
for (int i = 2; i <= sqr; i++) {
if (n % i == 0)
return false;
}
return true;
}
int main() {
int n, D;
scanf("%d", &n);
while (n >= 0) {
scanf("%d", &D);
bool flag1 = false;
bool flag2 = false;
if (isPrime(n)) flag1 = true; // 如果反转是素数,则标记为true
// 反转
// 十进制转换成 Q进制:除基取余法
int z[40], num = 0;
while (n != 0) {
z[num++] = n % D;
n /= D;
}
int ans = 0;
for (int i = 0; i < num; i++) {
ans += z[i];
if(i != num-1)
ans *= D;
}
if (isPrime(ans)) flag2 = true;
if (flag1 && flag2)
printf("Yes\n");
else
printf("No\n");
scanf("%d", &n);
}
return 0;
}