public int divide(int dividend, int divisor) {
//标记符号
boolean flag = dividend > 0 ^ divisor > 0;
//最后结果
int total = 0;
//化为负数
if (divisor > 0)
divisor = -divisor;
if (dividend > 0) {
dividend = -dividend;
}
//相同的值,直接返回
if (dividend == divisor)
return flag ? -1 : 1;
//大于半数的值,直接返回
if (divisor <= Integer.MIN_VALUE >> 1 && dividend < divisor)
return flag ? -1 : 1;
//寻找到一个最大的除数的倍数
int i;
for (i = 0; i < 31; i++) {
if (!(dividend < divisor << i && divisor << i > Integer.MIN_VALUE >> 1)) {
break;
}
}
i--;
//从最大的依次往下减
for (; i >= 0; i--) {
int td = divisor << i;
while (dividend <= td) {
dividend = dividend - td;
total += -1 << i;
td = divisor << i;
}
}
//异号直接返回,整数之间不存在溢出
if (flag)
return total;
//本处其实只针对 -2147483648 和 -1 这一种情况
if (total == Integer.MIN_VALUE)
return Integer.MAX_VALUE;
//同号返回
return -total;
}
leetcode_两数相除
最新推荐文章于 2024-04-24 17:34:53 发布