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 };
原文地址:https://www.cnblogs.com/fenshen371/p/5170502.html