题目描述
给定两个整数,被除数 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