目录

[Medium]LeetCode#29. 两数相除

[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
}