两数相除

74 阅读1分钟

题目链接:leetcode.cn/problems/di…

题解

func divide(dividend int, divisor int) int {
    // 1. 特殊情况:结果为 2^31 溢出
    if dividend == math.MinInt32 && divisor == -1 {
            return math.MaxInt32
    }
    // 2. 特殊情况:
    if divisor == 0 {
        return 0
    }

    // sign == 2 || sign == 0 则说明除数和被除数同号
    // sign == 1 则说明除数和被除数异号
    var sign = 2
    if dividend > 0 {
            dividend = -dividend
            sign--
    }
    if divisor > 0 {
            divisor = -divisor
            sign--
    }

    // 1. sign == 2 || sign == 0 则说明除数和被除数同号
    // 2. sign == 1 则说明除数和被除数异号

    var result = 0
    // 因为除数和被除数都是负数
    for dividend <= divisor {
        var temp_result = 1
        var temp_divisor = divisor

        // 试探被除数最多能被多少个除数去除
        for dividend < (temp_divisor << 1) {
                temp_divisor <<= 1
                temp_result <<= 1
        }

        dividend -= temp_divisor
        result += temp_result
    }

    if sign == 1 {
            return -result
    }
    return result
}

要点

  • 在计算机中,整数通常以补码的形式存储和表示,需要理解原码、反码和补码的含义以及各自怎么转换。由于 -2^31 的绝对值还是 -2^31,所以在题解中,把被除数和除数都转换成负数进行运算。

  • 在计算被除数最多能减掉多少个除数的时候,是有位运算 << 来缩短计算的步骤,以达到提效的目的。