回文数判断需先排除负数和末尾为0的正整数;0是回文数;用long long反转数字防溢出,通过取余和整除逐位重建逆序数后与原数比较。

回文数判断的核心思路:逆序重建原数
直接反转数字再比较,比转字符串更高效且符合题目约束。关键在于避免溢出和正确处理末尾为0的数(如10、100)——这类数不是回文,但反转后会丢失前导零,导致误判。
-
0是回文数;负数直接返回false - 末尾为
0的正整数(即n % 10 == 0 && n != 0)一定不是回文,可提前返回false - 用
long long存储反转结果,防止int溢出(例如2147483647反转后超INT_MAX)
手动反转数字的循环写法
每次取原数末位 n % 10,加到结果末尾:reversed = reversed * 10 + digit,然后 n /= 10。循环直到 n == 0。
bool isPalindrome(int n) {
if (n < 0) return false;
if (n % 10 == 0 && n != 0) return false;
long long reversed = 0;
int original = n;
while (n) {
reversed = reversed * 10 + n % 10;
n /= 10;
}
return reversed == original;
}
优化:只反转一半,避免 long long 依赖
真正只需要反转后半部分,再与前半部分比较。这样能规避 long long,也减少迭代次数。注意奇数位时,反转部分要除以10再比对(中间那位不用参与比较)。
- 循环条件是
n > reversed,当n 时停止 - 退出后,若原数长度为奇数,
reversed / 10 == n;偶数则reversed == n - 示例:
1221→ 最终n == 12,reversed == 12;12321→n == 12,reversed == 123,所以用reversed / 10 == 12
边界测试必须覆盖的几个数
不光测 121 或 12321 这类典型值,这几个容易漏掉:
立即学习“C++免费学习笔记(深入)”;
-
0:应返回true -
10、100:应返回false(提前拦截逻辑是否生效) -
INT_MAX(2147483647):反转后是7463847412,远超int范围,验证是否用了足够大的类型或半反转逻辑 -
123210:末位为0但非零数,必须在开头就return false
半反转法虽省空间,但判断奇偶位的分支容易写错;全反转法逻辑直白,但得小心溢出——选哪个取决于你更在意可读性还是内存占用。


















