Divide Two Integers -- LeetCode

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

思路:

采用位运算。我们先将两个数都看作是正数。

我们将除数左移一位就是将它扩大2倍,左移两位就是扩大4倍,一直左移到再左移一次就会大于被除数为止。

为了记录扩大了多少倍,用一个变量multi = 1也跟着一起左移。

然后用被除数减去扩大后的除数,若结果仍然大于等于原来的除数,则再重复刚才的过程。每次循环中结果都加上multi的值。

这个题中有两种情况可能溢出:

1. 除数是0.

2. 被除数是INT_MIN, 除数是-1。因为INT_MIN(-2147483648, -2^31)的绝对值比INT_MAX(2147483647, 2^31-1)要大一。

 1 class Solution {  2 public:  3     int divide(int dividend, int divisor) {  4         if (!divisor || (dividend == INT_MIN && divisor == -1))  5             return INT_MAX;  6         int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;  7         long long dvd = (long long)labs(dividend);  8         long long dvs = (long long)labs(divisor);  9         int res = 0; 10         while (dvd >= dvs) 11  { 12             long long tem = dvs, mul = 1; 13             while (dvd >= (tem << 1)) 14  { 15                 tem <<= 1; 16                 mul <<= 1; 17  } 18             dvd -= tem; 19             res += mul; 20  } 21         return sign * res; 22  } 23 };

 

你可能感兴趣的:(Divide Two Integers -- LeetCode)