简介

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

示例1:

输入: dividend = 10, divisor = 3
输出: 3

示例2:

输入: dividend = 7, divisor = -3
输出: -2

说明:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。
  • 本题中,如果除法结果溢出,则返回 2^31 − 1。

结果过程

参考leetcode评论区29.两数相除

该方法是将数,变为负数来求。

func divide(dividend, divisor int) int {
	a := dividend > 0
	b := divisor > 0
	// 判定商的符号
	var sign bool
	if a != b {
		sign = true
	}

	// 将被除数和除数转化负数进行运算
	if dividend > 0 {
		dividend = -dividend
	}
	if divisor > 0 {
		divisor = -divisor
	}
	// 进行循环求商
	res := 0
	for dividend <= divisor {
		temp_res := -1
		temp := divisor
		for dividend <= (temp << 1) {
			// 如果移位chu'xian负数越界
			if temp < math.MinInt32>>1 {
				break
			}
			temp = temp << 1
			temp_res = temp_res << 1
		}
		dividend -= temp
		res += temp_res
	}
	// 当商是正数的时候 进行取反操作
	if sign == false {
		// 防止正数越界 -2147483648 --> 2147483647(2147483648会越界
		if res <= math.MinInt32 {
			res = math.MaxInt32
		} else {
			res = -res
		}
	}
	return res
}