题目

题目要求,判断一个数本身,及其对应进制的数反转后,是否为质数

所以要考虑把一个十进制数,转到任意进制,再转回十进制,再作判断


解法1

点击查看代码
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 判断一个数是否是质数
bool is_prime(int num) {
    if (num < 2) return false;
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) return false;
    }
    return true;
}

// 进制转换:将 num 从 10 进制转换为 d 进制,并返回转换后的数字字符串
string convert_base(int num, int d) {
    string result = "";
    while (num > 0) {
        result += char((num % d) + '0');  // 取模得到当前位
        num /= d;
    }
    return result;
}

// 进制转换:将一个 d 进制表示的字符串转换回十进制
int to_decimal(string reversed_num, int d) {
    int result = 0;
    int power = 1;
    for (int i = reversed_num.size() - 1; i >= 0; i--) {
        result += (reversed_num[i] - '0') * power;
        power *= d;
    }
    return result;
}

int main() {
    int N, D;
    while (cin >> N >> D) {
        if (N < 0) break;  // 负数终止输入

        if (!is_prime(N)) {
            cout << "No" << endl;
            continue;
        }

        // 进制转换
        string reversed_base_D = convert_base(N, D);
        int reversed_N = to_decimal(reversed_base_D, D);

        if (is_prime(reversed_N)) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }

    return 0;
}

---

一些心得

1、如果不记得prime这个单词是“质数”,题目就看不懂了。

2、输入数据没有给定多少个,但说了负数是终止符,所以读取数据的方法要稍微变一下


拓展

1、质数是指只能被1和自身整除的自然数

2、代码上判断一个数是否为质数,要用1到sqrt(num)这些数去除