C++中负数模运算
在数学上, 一个负数$x<0$对$c$取模后, 得到的结果应该是大于等于0的, $x \% c = p$, 那么$c | (x - p)$.
但是在C++中, $x \% c$的结果和$|x| \% c$的结果是一样的.
因此, 按照如下模板取出一个整数(包括正数和负数)的每一位都是正确的, 不用特殊处理负数的情况.
int r = 0;
while (x) {
r = r * 10 + x % 10;
x /= 10;
}
如何判断溢出
当循环内溢出的时候, $10r + x \% 10 > INTMAX$, 负数同理.
class Solution {
public:
int reverse(int x) {
int r = 0;
while (x) {
/* r > 0, 10r + x % 10 > INT_MAX */
if (r > 0 && r > (INT_MAX - x % 10) / 10) return 0;
if (r < 0 && r < (INT_MIN - x % 10) / 10) return 0;
r = r * 10 + x % 10;
x /= 10;
}
return r;
}
};