回文数判断需先排除负数和末尾为0的非零数,再反转整数并与原数比较;反转时需防范溢出,可用long long暂存或做截断判断,符合不使用动态分配的要求。

回文数判断的核心思路:反转整数后比较
直接反转原数再与输入值对比,是最直观且无需动态分配的方法。关键在于处理负数、末尾为0的数(如10、100),以及反转过程中的溢出风险——但题目限定“不使用动态分配”,意味着我们应避免 std::string 或 vector,也排除转字符串再双指针的方案。
注意:int 反转时可能溢出(例如 2147483647 反转成 7463847412),但回文数本身必须在 int 范围内,所以只要原数合法,其回文形式也必须合法;因此我们只在反转过程中做简单截断判断,不依赖 long long 也可行(不过加一层 long long 中间存储更稳妥,且不违反“不使用动态分配”)。
负数和末尾为0的数必须提前返回 false
负数带符号,不可能是回文;以0结尾(非0本身)的数,反转后首位是0,而原数首位不是0,必然不等。这两个情况不参与反转计算,直接拦截。
x → 直接返回 <code>false-
x != 0 && x % 10 == 0→ 返回false(排除 10、100、200 等) - 特别地,
x == 0是回文,要保留
用 while 循环逐位反转整数
通过 x % 10 拿末位,x / 10 去掉末位,在循环中不断构建反转值。推荐用 long long 存反转结果,避免 int 溢出导致误判(比如 1000000009 反转是 9000000001,超出 int 范围,但作为中间值无妨)。
示例代码逻辑:
int x = 1221;
long long rev = 0;
int tmp = x;
while (tmp != 0) {
rev = rev * 10 + tmp % 10;
tmp /= 10;
}
return rev == x;
注意:tmp 用 int 即可,反转过程用 long long 防溢出,最后再与原 int 比较——C++ 允许隐式转换,且不会丢失精度(因为原值本就在 int 范围内)。
边界测试容易漏掉的 case
写完别急着提交,这几个值一试就暴露问题:
-
0→ 应返回true -
-121→ 提前返回false -
10→10 % 10 == 0且x != 0,返回false -
12321→ 正常回文,反转后相等 -
1534236469→ 反转后超int,但用long long存就不会截断误判
真正麻烦的是反转中间过程溢出导致未定义行为——所以哪怕题目没提溢出,只要用了 int 做反转变量,就大概率在某些平台挂掉。用 long long 不算动态分配,也不影响栈空间,是最轻量又安全的选择。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











