1. 题目来源
链接:lc7. 整数反转
2. 题目解析
方法一:数学+溢出判断
首先 atos
转成字符串,再 reverse
一遍,再 stoi
,就不再讨论了。在此,讨论数学做法。
x%=10,x/=10
就能得到x
的每一位。这也是通用的做法- 定义变量
r
存储逆序值,r=r*10+x
就能对齐进行翻转。这个也是 秦九昭算法的应用。 - 整理可得
while (x) { r=r*10+x%10;x/=10; }
就搞定了
注意:
c++
取模运算的特点:正数取模还是正数,负数取模还是负数(没考虑取模为 0 的情况)。然而在数学上保证都是正数,这也是c++
的一个特点。也是很方便这道题的处理
经典的溢出判断:
数学相关的东西,建议手推一遍。
代码:
// 投机取巧
class Solution {
public:
int reverse(int x) {
long long res = 0;
while (x) { res = res * 10 + x % 10; x /= 10; }
if (res > INT_MAX || res < INT_MIN) return 0;
return res;
}
};
// 数学判断溢出
class Solution {
public:
int reverse(int x) {
int res = 0;
while (x) {
if (res > 0 && res > (INT_MAX - x % 10) / 10) return 0;
if (res < 0 && res < (INT_MIN - x % 10) / 10) return 0;
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
};