回文数判断的核心难点是翻转过程中可能溢出,需只翻转一半数字来避免;负数及末位为0的正数(除0外)直接返回false,再通过比较前半段与后半段判断是否回文。

回文数判断的核心难点在哪
关键不是“怎么翻转数字”,而是“翻转过程中可能溢出”。int 有符号范围是 −2³¹ 到 2³¹−1(约 ±21 亿),比如 1999999999 翻转成 9999999991 直接超出 int 表示范围,未定义行为就来了。不借助字符串或数组这类辅助空间,就得在数值层面安全地比对前半段和后半段。
只翻转一半数字的原理与实现
回文数的对称性允许我们只处理一半:把原数不断取余、除以 10,把末位逐个“剥”下来拼成新数;同时原数不断去掉末位。当“剥出来的数” ≥ “剩下的数”时,就翻了一半。此时分两种情况:
• 总位数为偶数:直接比较两部分是否相等
• 总位数为奇数:剥出来的数去掉最后一位再比较(中间那位不用管)
- 用
while (x > reversed)控制循环,避免多翻一位 - 每次迭代做:
reversed = reversed * 10 + x % 10和x /= 10 - 循环结束后,检查
x == reversed(偶数位)或x == reversed / 10(奇数位) - 注意边界:负数直接返回
false;末位为 0 的正数(如10)只有0本身是回文,其余都不是
完整可跑的判断函数
以下代码处理所有边界,不依赖额外空间,也不触发溢出:
bool isPalindrome(int x) {
if (x reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
return x == reversed || x == reversed / 10;
}
测试用例:isPalindrome(121) → true;isPalindrome(1221) → true;isPalindrome(10) → false;isPalindrome(-121) → false。
为什么不能用 long long 简单粗暴翻转
看似绕过溢出,但题目明确要求“不使用辅助空间”,而 long long 是更大范围的整型,并非“辅助空间”——它只是类型升级。不过更关键的是:这没解决本质问题。比如输入是 int64_t 范围内的数,你又得换更大类型,陷入无限套娃。真正的约束是“仅用常数额外变量”,且逻辑必须对任意 int 输入健壮。上面的半翻转法才是符合题意的解法。
最容易被忽略的是末位为 0 的非零数,它们一定不是回文——这个判断必须放在开头,否则 10 会进循环,最终算出 reversed=1、x=1,误判为真。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











