[Medium]LeetCode#29. 两数相除

[Medium]LeetCode#29. 两数相除

题目原地址

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

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

示例 1:

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

示例 2:

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

说明:

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

  • 自己想的思路,一个除数一个除数的去做加法,虽然可以实现,但是会超时,真是废柴
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次幂做累加,然后再判断当前的和是否大于被除数,如果大于的话,再把除数和偏移量回置
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
}