[Medium]LeetCode#29. 两数相除
题目原地址
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
1
2
| 输入: dividend = 10, divisor = 3
输出: 3
|
示例 2:
1
2
| 输入: dividend = 7, divisor = -3
输出: -2
|
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
自己想的思路,一个除数一个除数的去做加法,虽然可以实现,但是会超时,真是废柴
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
| func divide(dividend int, divisor int) int {
res := 0
sum := 0
sign := 1
if dividend < 0 {
sign = -sign
dividend = -dividend
}
if divisor < 0 {
sign = -sign
divisor = -divisor
}
for i := 0; sum <= dividend; i++ {
sum += divisor
res = i
}
if sign < 0 {
res = -res
}
if res > 2147483647 {
res = 2147483647
}
if res < -2147483648 {
res = -2147483648
}
return res
}
|
另一种解题方案,先判断正负值,除数乘以2的n次幂做累加,然后再判断当前的和是否大于被除数,如果大于的话,再把除数和偏移量回置
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
31
| func divide(dividend int, divisor int) int {
res := 0
sign := 1
if dividend < 0 {
sign = -sign
dividend = -dividend
}
if divisor < 0 {
sign = -sign
divisor = -divisor
}
for dividend >= divisor {
var tmp, i = divisor, 1
for dividend-tmp >= 0 {
dividend -= tmp
res += i
i <<= 1
tmp <<= 1
}
}
if sign < 0 {
res = -res
}
if res > 2147483647 {
res = 2147483647
}
if res < -2147483648 {
res = -2147483648
}
return res
}
|