【题目解析】
对【除数】进行倍增的方式,与【被除数】比较。
举个例子:11 除以 3 。
- 首先11比3大,结果至少是1;
- 然后我让3翻倍,就是6,发现11比3翻倍后还要大,那么结果就至少是2;
- 那我让这个6再翻倍,得12,11不比12大,退出此轮【倍增】,此轮得到【商】的结果为2。
- 接下来让11减去刚才最后一次的结果6,剩下5,接下来我们计算5是3的多少倍。此时递归形式出现了,即重复1,2,3步骤。
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
# 前期的判断
if abs(dividend) < abs(divisor):
return 0
sign = (dividend > 0) ^ (divisor > 0)
dividend = abs(dividend)
divisor = abs(divisor)
# 核心部分
result = 0
tmp_result = 1
tmp_value = divisor
tag = True
while tag:
while dividend >= tmp_value:
if tmp_value + tmp_value < dividend:
tmp_value += tmp_value
tmp_result += tmp_result
else:
break
dividend -= tmp_value
result += tmp_result
tmp_result = 1
tmp_value = divisor
if dividend < tmp_value:
tag = False
# 对结果的特殊情况,特殊分析
result = -result if sign else result
if result >= 2**31:
return 2**31 - 1
elif result <= -2**31:
return -2**31
return result