把三位回文数按 aba = 101a + 10b 直接生成 90 个候选,再对每个候选试除判素数;回文性由生成方式保证,无需运行期判回文。
OJ: roj
题目 ID: 1155
难度:入门
标签:入门枚举数论素数回文数python
创建: 2026-09-29 21:14
更新: 2026-10-05 03:45
题目描述
如果一个数从左边读和从右边读都是同一个数,就称为回文数,例如 6886 就是回文数。求所有的既是回文数又是素数的三位数。
输入:无。输出:每行一个满足条件的数,按从小到大顺序,共 15 个。
思路
三位回文数形如
参考代码
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;
}