回文数判断需避免字符串和动态数组,仅用栈上变量和算术操作;通过反转后半数字并与前半比较实现,负数及末位为0(非零数)直接返回false,奇数长度时检查x==reversed或x==reversed/10。

回文数判断的核心限制:不能用字符串或数组存数字
直接转成 std::string 再双指针比较是最常见写法,但题目明确禁止辅助动态空间——这意味着不能调用 std::to_string、不能 new 数组、不能用 std::vector 存各位数字。唯一能用的是栈上变量(如 int、long long)和算术操作。
反转一半数字比对:避免溢出的关键策略
暴力反转整个数(如 12321 → 12321)看似可行,但遇到 INT_MAX = 2147483647 这类边界值时,反转后可能溢出 int,导致未定义行为。稳妥做法是只反转后半部分,再与前半部分比较。比如 1221 → 反转后两位得 12,前半也是 12;12321 → 反转后两位得 12,前半是 12(中间的 3 被忽略)。
实操要点:
- 用
while (x > reversed)控制循环,每次x /= 10去掉末位,reversed = reversed * 10 + x % 10累加末位 - 处理奇数长度:循环结束后若
x == reversed或x == reversed / 10都算回文(后者对应中间位被多算一次) - 负数直接返回
false(符号位破坏回文结构) - 末位为 0 的正数(如 10, 100)直接
false(除非是 0 本身)
C++ 实现示例(含边界处理)
bool isPalindrome(int x) {
if (x reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
return x == reversed || x == reversed / 10;
}
注意:reversed 定义为 int 是安全的——因为只反转一半,最大输入 2147483647 的后半最多是 47384712,远小于 INT_MAX。但若用 unsigned int 接收 x % 10,需确保符号一致,此处直接用 int 更直白。
为什么不用 long long 就足够?
有人习惯把 reversed 设为 long long 防溢出,其实没必要。32 位 int 最大 10 位数,反转一半最多 5 位,上限是 99999,而 INT_MAX 是 2147483647(10 位),完全容纳得下。真正要警惕的是反转「整个」数时的溢出,而非「一半」。
最易被忽略的点:x % 10 == 0 && x != 0 这个判断必须放在开头。否则像 100 进入循环后变成 x=10, reversed=0 → x=1, reversed=0 → x=0, reversed=1,最终误判为真。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











