回文素数是同时满足“是素数”和“是回文数”的正整数;判断时应先高效检测回文(如数学反转法,排除末位为0等明显非回文情况),再进行素数判定以提升性能。

什么是回文素数?先明确判断逻辑
回文素数 = 同时满足「是素数」和「是回文数」两个条件。不能只判一边,比如 121 是回文但不是素数,13 是素数但不是回文。C++ 中没有内置函数直接判断,得自己组合实现。
关键点在于:顺序很重要——先判素数还是先判回文?建议先判回文,因为回文判断快(字符串或数字反转),而素数判断在大数时开销高;如果一个数明显不是回文(如末位是偶数且 ≠ 2),直接跳过素数检测能省不少时间。
is_palindrome() 怎么高效写?别转字符串
转 std::string 再比较虽然直观,但涉及内存分配和字符拷贝,在频繁调用(比如筛 1e6 内所有回文素数)时有明显性能损失。更推荐纯数学反转:
bool is_palindrome(int n) {
if (n < 0 || (n > 0 && n % 10 == 0)) return false; // 负数、末位0(除0本身)不可能回文
int rev = 0, orig = n;
while (n > 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
return rev == orig;
}-
n % 10 == 0排除如10、200这类数,它们反转后位数变少,一定不等 - 注意
int溢出风险:若原数接近INT_MAX(约 2e9),反转可能溢出。实际用于回文素数时,通常只检查到 1e7 左右,可暂不处理;若需更大范围,改用long long或逐位比较首尾
is_prime() 的边界和优化要点
回文素数最小是 2,最大常见于题目限制(如 ≤ 1e5)。写素数判断时容易错在边界:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- 必须特判
n → <code>false;n == 2→true;n为偶数且 ≠ 2 →false - 试除上限用
sqrt(n),但别写成i —— <code>sqrt()是浮点运算,有精度误差;应写i * i - 循环从
i = 3开始,步长为 2,跳过所有偶数
bool is_prime(int n) {
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) return false;
}
return true;
}组合判断时的常见坑
把两个函数拼起来看似简单,但实际使用中容易忽略这些细节:
-
is_palindrome(2)返回true,is_prime(2)也返回true→2是合法回文素数;但很多人漏掉这个特例,导致结果少一个 - 输入为
0或1:两者都不是素数,但is_palindrome(0)是true,必须靠is_prime()拦住 - 多线程或批量判断时,避免重复计算:比如已知
121不是素数,就别再对它的反转(还是121)做二次素数判断 - 若要找区间内所有回文素数,不要对每个数都调用两遍完整判断;可先生成回文数(如枚举各位数字对称构造),再单独判素数,效率高一个数量级
最易被忽略的是:回文判断对负数、前导零的隐含假设。C++ 整数没有前导零,所以 101 和 0101(即 101)视为同一数,无需额外处理;但如果你从字符串输入解析,就得先去空格和前导零,再转整数,否则 "010" 会被当作 10 判回文失败。

















