/*因为不能使用乘法,除法,取余数的操作,能达到此目的方法只有位操作符中的左右移位运算了。
但是在此运算中有几个特殊情况需要特殊处理,除数是0,因为除数与被除数均是int类型
因此被除数最小为INT_MIN,但是当除数为-1的时候结果值会出现越界,因为当这种情况发生,
令结果为最大值INT_MAX;*/
class Solution {
public:
int divide(int dividend, int divisor) {
if (divisor == 0 || (dividend == INT_MIN&&divisor == -1))
return INT_MAX;
int flag = 1, result = 0;//flag代表结果的正负标志默认是正值,result代表的是结果的绝对值
if ((dividend<0 && divisor>0) || (dividend > 0 && divisor < 0))
flag = -1;
long long divd, div;
if (dividend==INT_MIN)
divd = 2147483648;
else
divd = abs(dividend);//防止被除数与除数是INT_MIN,取绝对值后越界,因此采用long long 类型
if (divisor==INT_MIN)//当int 类型取INT_MIN时,其绝对值是本身,并不会出现正值。因此绝度值只能人工强行赋值
div = 2147483648;
else
div = abs(divisor);
if (divd == 0||(divd<div))
return 0;
while (divd >= div)
{
int temp = 1;
long long hdiv = div;
while (divd > (hdiv << 1))//位运算操作:左移n位相当于乘以2的n次方,此目的就是找出商;
{
hdiv = hdiv << 1;
temp = temp << 1;
}
divd = divd - hdiv;
result = result + temp;
}
return flag*result;
}
};
29. Divide Two Integers
最新推荐文章于 2019-11-06 15:25:17 发布