回文数判断需先排除负数和末尾为0的正数;再通过反转一半数字比较,偶数位时x==reversed,奇数位时x==reversed/10;注意int溢出风险与整除截断特性。

回文数判断的核心陷阱:负数和末尾为0的数
直接取反再比较会失败,因为 int 溢出风险高,且负数、以0结尾的正数(如10、100)根本不可能是回文——但它们的反转可能意外合法(比如 -121 反转后是 -121,但数学上不视为回文)。所以必须提前拦截:
- 若
x ,直接返回 <code>false - 若
x % 10 == 0 && x != 0(即末尾是0但本身不是0),也返回false
用整数翻转一半来避免溢出
不翻转整个数,只翻转后半部分,然后和前半部分比较。这样既能规避 int 溢出(比如 2147483647 翻转后超限),又减少计算量。关键在于“翻转到什么程度停”:
- 循环条件用
while (x > reversed),每次做reversed = reversed * 10 + x % 10,然后x /= 10 - 结束时,若原数长度为偶数,
x == reversed;若为奇数,x == reversed / 10(中间那位被留在x里) - 例如
1221:翻转后x=12,reversed=12→ 相等;12321:翻转后x=12,reversed=123→ 判断x == reversed / 10即12 == 12
C++实现中要注意的整除与类型细节
int 除法自动截断,这点可以利用,但别误以为 / 是浮点除法。另外,所有中间变量必须是 int(不能用 long long 隐式规避——题目明确要求“不转字符串”,没说不能用更大类型,但真实面试或竞赛常隐含考察溢出意识):
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
bool isPalindrome(int x) {
if (x reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
return x == reversed || x == reversed / 10;
}
注意:x /= 10 和 x % 10 的顺序不能颠倒;reversed * 10 + x % 10 这一步在 reversed 接近 INT_MAX/10 时仍可能溢出——但题目只要求判断回文,而所有回文数本身都在 int 范围内,其一半翻转值必然更小,实际不会溢出。真正要警惕的是把 reversed 声明成 unsigned int 或混用有无符号运算。
边界测试不能只靠 121、1221
容易漏掉的 case 很多,光跑几个样例不够:
-
0:应返回true(单数字是回文) -
10、100:提前被x % 10 == 0拦住 -
INT_MIN(-2147483648):负数直接返回false,无需翻转 -
123321:偶数位,检查x == reversed -
12321:奇数位,检查x == reversed / 10
最易错的是把奇数位逻辑写成 x == reversed % 10 或漏掉 / 10——那个“中间数字”就卡在 x 里,它不需要参与比较。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










