题目描述

给定两个整数,被除数 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。

解题思路
由于不允许使用乘法、除法或者mod运算符,因此将两个两个数的除法转换为两个数的对数的减法。
1.若除数或被除数为0,则直接返回0:

		if divisor == 0 or dividend == 0:
            return 0

2.将两个数转换为对数形式做减法后,再求解结果的指数,转换回除法结果:

result = int(math.exp(math.log(abs(dividend)) -  math.log(abs(divisor))))

3.若除数或被除数其中一个为负,则将结果转换为负数:

		if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor>0):
            result = -result

4判断数值范围是否在[−231, 231 − 1]范围内:

		if result < pow(-2, 31):
            return pow(-2, 31)
        elif result > pow(2, 31) - 1:
            return pow(2, 31) - 1
        else:
            return result

完整代码

import math
class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        if divisor == 0 or dividend == 0:
            return 0
        result = int(math.exp(math.log(abs(dividend)) -  math.log(abs(divisor))))
        if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor>0):
            result = -result
        if result < pow(-2, 31):
            return pow(-2, 31)
        elif result > pow(2, 31) - 1:
            return pow(2, 31) - 1
        else:
            return result