C++面向对象实现回文数遇有符号整数溢出问题求助
解决C++回文数判断中的整数溢出与逻辑错误
原代码存在的问题
rev未初始化:局部变量默认是随机垃圾值,直接用rev * 10计算会导致逻辑混乱。- 未处理负数与特殊正数:负数不可能是回文(带负号);末尾为0但本身不是0的数(如120),反转后必然不等于原数,原代码未提前排除这些情况。
- 反转时无溢出检查:当输入较大正数(如1999999999),
rev * 10 + x%10会超出int的最大值(2^31-1=2147483647),触发有符号整数溢出的未定义行为,也就是你遇到的错误。 - 类名拼写错误:
Solutiuon多了一个u,正确应为Solution。
修正方案1:反转一半数字(推荐,无溢出风险且高效)
这种方法通过只反转一半数字来避免溢出,同时减少计算量:
class Solution { public: bool isPalindrome(int x) { // 提前排除不可能的情况 if (x < 0 || (x != 0 && x % 10 == 0)) { return false; } int rev = 0; // 反转一半数字:当x <= rev时,说明已反转一半 while (x > rev) { rev = rev * 10 + x % 10; x /= 10; } // 偶数位:反转后rev等于剩余的x;奇数位:rev去掉中间位后等于x return x == rev || x == rev / 10; } };
修正方案2:用更大类型存储反转结果(简单直接)
如果不想改逻辑,可以用long long存储反转值,避免溢出:
class Solution { public: bool isPalindrome(int x) { if (x < 0) return false; long long rev = 0; int temp = x; while (temp > 0) { rev = rev * 10 + temp % 10; temp /= 10; } return rev == x; } };
内容的提问来源于stack exchange,提问作者Pratick
相关产品推荐
相关产品推荐

