题目
给你两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate
)其小数部分。例如,8.345
将被截断为 8
,-2.7335
将被截断至 -2
。
返回被除数 dividend
除以除数 divisor
得到的 商 。
注意: 假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−2
31, 2
31− 1]
。本题中,如果商 严格大于 2
31− 1
,则返回 2
31− 1
;如果商 严格小于 -2
31 ,则返回 -2
31。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。
1
2
3
2
3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。
1
2
3
2
3
提示:
-2
31<= dividend, divisor <= 2
31- 1
divisor != 0
题解
java
public int divide(int dividend, int divisor) {
// 由于使用正数会导致溢出
// 所有数字均换为负数 正数最大值改为负数不会溢出
// 正负标识
boolean isPositive = dividend >= 0 && divisor >= 0 || dividend < 0 && divisor < 0;
dividend = dividend > 0 ? -dividend : dividend;
divisor = divisor > 0 ? -divisor : divisor;
int result = 0;
while (dividend <= divisor) {
// 除数翻倍的次数
int times = 0;
int timesDivisor = divisor;
// timesDivisor < 0 防止负数位移溢出
while (dividend <= timesDivisor) {
result += 1 << times;
dividend -= timesDivisor;
// 除数翻倍
times++;
timesDivisor <<= 1;
// 位移溢出
if(timesDivisor >= 0) {
break;
}
}
}
// 若符号为正 结果为负数 则正数溢出
return isPositive ? (result < 0 ? Integer.MAX_VALUE : result) : -result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30