目录
题目描述
给你两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate
)其小数部分。例如,8.345
将被截断为 8
,-2.7335
将被截断至 -2
。
返回被除数 dividend
除以除数 divisor
得到的 商 。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1]
。本题中,如果商 严格大于 231 − 1
,则返回 231 − 1
;如果商 严格小于 -231
,则返回 -231
。
样例
代码
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if dividend > 0 and divisor > 0: signal = 1
elif dividend < 0 and divisor < 0: signal = 1
else: signal = -1
result = 0
dividend = abs(dividend)
divisor = abs(divisor)
while dividend >= divisor:
count = 1
temp_divisor = divisor
while dividend >= (temp_divisor << 1):
temp_divisor <<= 1
count <<= 1
dividend -= temp_divisor
result += count
result *= signal
if result > 2 ** 31 - 1: return 2 ** 31 - 1
elif result < -2 ** 31: return -2 ** 31
else: return result
解题思路
一开始是循环(被除数 -= 除数),商++,但是数大起来很快就超时了,所以改成让除数不断*2,该次运算加进的商也不断*2,直到减不动为止,然后在重置当前除数和当前商,指数级加速计算过程。