您的位置:首页 > 其它

29. Divide Two Integers

2016-05-12 18:54 337 查看

Problem

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

If it is overflow, return MAX_INT.

Solution

  参考。

  在这道题中,要求两个整数的商,但是不能使用除法、乘法和取模操作,所以只能使用位运算

  首先看个例子,15除以3,15是被除数,3是除数。除法就是为了找到从被除数能减去多少个除数,同时不会使结果为负数,也就是找到使得“被除数-除数*n>=0”成立的最大的n。

  首先用15-3=12,正数。尝试从15中减去更多,将3左移一位得到6,15-6=9,还是正数。再将6左移一位得到12,15-12=3,还是正数。但是当将12左移一位得到24时,我们知道最多只能减去12。因为12是3通过左移两次得到的,所以12是3的4倍。也就是从1开始,左移两次得到4。我们将4加在返回值上(返回值初始化为0)。现在我们得到商4,余数3,然后我们重复上面的过程。

  导致移除的情况有两个:

  1. 除数是0

  2. 被除数是INT_MIN,同时除数是-1(因为abs(INT_MIN) = INT_MAX+1)。

class Solution {
public:
int divide(int dividend, int divisor) {
//handle overflow
if(divisor == 0 || (dividend == INT_MIN && divisor == -1))
return INT_MAX;
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1:1;

long long dvd = labs(dividend);
long long dvs = labs(divisor);

int ret = 0;
while(dvd >= dvs)
{
long long tmp = dvs;
long long multiple = 1;
while(dvd >= (tmp << 1))
{
tmp <<=1;
multiple <<=1;
}

dvd -= tmp;
ret += multiple;
}

return sign == 1?ret:-ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: