整数除法

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

def divide(dividend, divisor):
    if dividend == 0:
        return 0
    
    # 只能存储 32 位有符号整数,其数值范围是 [−2**31,  2**31 − 1]。本题中,如果除法结果溢出,则返回 2**31 − 1
    if dividend == -2 ** 31 and divisor == -1:
        return 2 ** 31 -1
    
    s1 = dividend > 0
    s2 = divisor > 0
    same_s = s1 == s2
    
    abs_dividend = abs(dividend)
    abs_divisor = abs(divisor)
    
    # 尝试减去1、2、4、8……个除数
    def divide_part(a, b):
        if a < b:
            return 0
        res = 1
        value = b
        while a >= value + value:
            value += value # 用加法代替乘2
            res += res
        return res + divide_part(a - value, b)
    
    result = divide_part(abs_dividend, abs_divisor)
    result = result if same_s else -result
    
    return result
上一篇:Leetcode - 29. 两数相除


下一篇:08-操作符和数据类型总结