29. Divide Two Integers

来源:互联网 发布:怎么成为java高级编程 编辑:程序博客网 时间:2024/05/18 15:56

题目:Divide Two Integers

原题链接:https://leetcode.com/problems/divide-two-integers/

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

If it is overflow, return MAX_INT.

模拟除法,不能使用乘法,除法或者取余运算符。
如果溢出,则返回INT_MAX.

使用位运算来模拟除法。
为了便于处理,首先除数和被除数都取绝对值并且转化成long long型。

首先看一种最原始的方法模拟除法,不断的把被除数减去除数,一直到被除数小于除数为止,这种方法有效但是效率不高,我们可以想办法加快这个过程。
我们可以不需要每次只减去一个除数,可以直接将除数左移(这样就是把除数乘以2,乘以4,乘以8。。。)一直到逼近被除数为止,这样可以一次性减去除数乘以(2^n),能够大大的提高效率,然后循环这一过程,直到被除数小于除数为止。
那么,如何得出结果呢?只要每次加上除数所叠加的倍数(即2^n)就可以了。
溢出的情况有两种,第一种是除数为0,第二种是当被除数是INT_MIN并且除数是-1的时候,这种情况下结果比INT_MAX大1,也是超出了范围的。

代码如下:

class Solution {public:    int divide(int dividend, int divisor) {        if(!divisor || (dividend == INT_MIN && divisor == -1)) return INT_MAX;        bool flag = ((dividend < 0) ^ (divisor < 0)) ? false : true;        int ans = 0;        long long td = labs(dividend), ts = labs(divisor);        while(td >= ts) {            long long temp = ts, cnt = 1;            while(td >= (temp << 1)) {                temp <<= 1;                cnt <<= 1;            }            td -= temp;            ans += cnt;        }        return flag ? ans : -ans;    }};
0 0