正整数转字符串后双指针首尾比较最直观可靠;负数因含'-'号直接返回false;int最多10位,string无溢出压力。

用 std::to_string 转字符串后双指针比较最直观
对正整数而言,转成字符串再首尾比对是最少出错的方式。它不关心位数、不处理负号逻辑、也不用担心溢出——int 最大才 10 位,std::string 完全无压力。
注意:负数一律不是回文数(因为带 '-' 符号),直接返回 false 即可。
bool isPalindrome(int x) {
if (x < 0) return false;
std::string s = std::to_string(x);
int l = 0, r = s.length() - 1;
while (l < r) {
if (s[l++] != s[r--]) return false;
}
return true;
}纯数字反转法要注意溢出和末尾零的陷阱
数学法是把原数逐位取模、构造反转数,再与原数比较。但有两个硬伤:int 反转可能溢出(比如 1000000009 反转后是 9000000001),以及像 10、200 这类末尾有零的数,反转后变成 1、2,直接比较会误判。
- 必须用
long long存反转结果,否则反转过程就溢出 - 提前判断
x % 10 == 0 && x != 0:能立刻排除所有末尾为 0 的非零数(除了 0 本身) - 反转只需进行到一半即可(如 1221 → 反转后半段得 12,与前半段相等),但实现略复杂,初学者建议先用完整反转
bool isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
long long reversed = 0;
int original = x;
while (x != 0) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
return reversed == original;
}不依赖 std::to_string 的 C 风格写法(适合嵌入式或禁 STL 环境)
如果编译环境禁用 STL(比如某些裸机或竞赛限制),可用静态数组手动拆解各位数字。关键点在于:先确定位数,再填入数组,最后双指针扫。
立即学习“C++免费学习笔记(深入)”;
- 用
log10算位数不推荐——浮点运算慢且log10(1000)可能返回2.999999导致向下取整出错 - 更稳妥的是用循环除 10 计数,或直接用
snprintf(buf, sizeof(buf), "%d", x)(但需确保 buf 足够大,至少 12 字节) - 注意
INT_MIN取反会溢出,所以仍要先判负
bool isPalindrome(int x) {
if (x < 0) return false;
char buf[12];
int len = snprintf(buf, sizeof(buf), "%d", x);
for (int i = 0; i < len / 2; ++i) {
if (buf[i] != buf[len - 1 - i]) return false;
}
return true;
}性能与可读性权衡:别为了“不用字符串”强行写数学法
在绝大多数现代 C++ 项目中,std::to_string 版本足够快,且逻辑清晰、边界明确。g++/Clang 对短字符串转换做了优化,实测 10 万次调用耗时差异不到 5%。
真正需要数学法的场景极少:比如必须避免堆分配(std::string 默认用堆)、或输入范围极大(如 long long 且不能用 std::to_string 重载)、或题目强制要求 O(1) 空间。
实际写业务代码时,看到有人用六行取模反转代替一行 to_string + 双指针,大概率是在炫技或者没想清负数和零的处理。











