算法题-反转整数

  1. C++中负数模运算
  2. 如何判断溢出

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;
    }
};