回文数判断采用反转一半数字法:负数或末尾为0的正数直接返回false;循环中x逐位剥离,reversed累积低位反转值,当reversed≥x时停止;最终x==reversed(偶数位)或x==reversed/10(奇数位)即为回文。

用整数反转法判断回文数(C++)
直接反转原数的一半,再和另一半比较,是不转字符串、空间 O(1) 的可靠做法。关键不是“能不能反转”,而是“反转到哪停”——避免溢出且精准切分。
- 负数直接返回
false(符号导致不可能回文) - 末尾为 0 的正数(如
10、120)也直接false(除非是0本身) - 用
reversed = reversed * 10 + x % 10逐步反转低位;同时x /= 10剥离已处理位 - 停止条件:当
reversed >= x时停下,此时reversed已包含原数后半(或后半+1位)
处理奇数位长度的边界情况
比如 12321,反转中途会得到 x == 12、reversed == 123,此时 reversed > x,多反转了一位。正确做法是最后比较时忽略中间那一位。
- 若原数位数为奇数,最终
reversed / 10 == x才算回文(去掉反转数的最高位) - 若为偶数,直接
reversed == x - 无需提前计算位数或用 log10 —— 反转过程天然隐含长度信息
为什么不用 long 防溢出?
题目通常限定输入在 int 范围内(如 LeetCode 9),而反转一半后的值一定 ≤ 原数,不会比 INT_MAX 更大。但若硬要反转整个数,1234567899 这类数反转后会溢出 int,导致未定义行为。
- 只反转一半,最大反转值约为 √INT_MAX 量级(约 46340),远低于溢出阈值
- 用
int类型足够,无需long或long long—— 多余类型反而干扰可读性和移植性 - 检查
reversed > INT_MAX / 10是过度防御,实际不需要
完整可运行逻辑片段
bool isPalindrome(int x) {
if (x reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
return x == reversed || x == reversed / 10;
}
最后一行的双条件就是奇偶统一处理的核心:前者覆盖偶数位(如 1221 → x==12, reversed==12),后者覆盖奇数位(如 12321 → x==12, reversed==123)。漏掉 /10 就会把所有奇数位数判错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











