回文三位数

GitHub跳转原题关系图返回列表

把三位回文数按 aba = 101a + 10b 直接生成 90 个候选,再对每个候选试除判素数;回文性由生成方式保证,无需运行期判回文。

OJ: roj

题目 ID: 1155

难度:入门

标签:入门枚举数论素数回文数python

创建: 2026-09-29 21:14

更新: 2026-10-05 03:45

题目描述

如果一个数从左边读和从右边读都是同一个数,就称为回文数,例如 6886 就是回文数。求所有的既是回文数又是素数的三位数。

输入:无。输出:每行一个满足条件的数,按从小到大顺序,共 15 个。

思路

三位回文数形如 aba‾=101a+10b\overline{aba} = 101a + 10b,直接枚举 a∈[1,9]a \in [1,9]、b∈[0,9]b \in [0,9] 生成全部 90 个候选,回文性由生成方式本身保证,不必再判回文。对每个候选试除到 x\sqrt{x} 判断是否为素数,是素数就输出。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 21:15
# update_at: 2026-09-29 21:20

from math import isqrt


def is_prime(n: int) -> bool:
    """试除法判素数:2 到 ⌊√n⌋ 之间没有任何因子,n 就是素数。"""
    return n > 1 and all(n % d != 0 for d in range(2, isqrt(n) + 1))


# 三位回文数形如 aba,即 100a + 10b + a = 101a + 10b;a 取 1..9、b 取 0..9,共 90 个
THREE_DIGIT_PALINDROMES = tuple(101 * a + 10 * b for a in range(1, 10) for b in range(10))


def solve() -> None:
    """本题没有输入:直接生成候选回文数,筛出素数后一个数一行输出。"""
    print("\n".join(map(str, filter(is_prime, THREE_DIGIT_PALINDROMES))))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 03:45
 * update_at: 2026-10-05 03:45
 */
// 三位回文素数:按 aba = 101a + 10b 直接生成 90 个回文候选,再试除判素数
#include <iostream>
using namespace std;

typedef long long ll;

// 试除法判断素数:只需试除到 floor(sqrt(n)),写成 d*d <= n 避免开方的浮点误差
bool is_prime(ll n) {
    if (n < 2) {
        return false;
    }
    for (ll d = 2; d * d <= n; d++) {
        if (n % d == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // 三位回文数形如 aba:a 是百位/个位取 1..9,b 是十位取 0..9,共 90 个候选
    for (ll a = 1; a <= 9; a++) {
        for (ll b = 0; b <= 9; b++) {
            ll x = 101 * a + 10 * b;
            if (is_prime(x)) {
                cout << x << "\n";
            }
        }
    }
    return 0;
}