两数相除
题目描述
给定两个整数,被除数 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。
解题方法
方法一:
本题不可以用乘法 除法,那么可以将题目转化为,被除数是多少个除数之和:
如果用累加的方法直接循环累加, 会出现超时情况
解决超时情况:
第一反应会想到,使用二分法
例: 57/1
res=1
res=2 -------当57>12
res=4 -------当57>22
res= 8 -------当57>42
res=16 ------当57>82
res=32 ------当57>162
res != 64 ----当57>322
res1=1
res1=2 -------当57-321>12
res1=4 -------当57-321>22
res1=8 -------当57-321>42
res1=16 ------当57-321>82
res1!=16 -----当57-321>162同理 res2 = 8 ,res3=1
res = res+res1+res2 +res3=32+16+8+1=57
进一步修改算法:使用位移算法,且从最大res考虑 即 最开始考虑res==2**31情况,dividend>res2, 当 条件成立时,即为本次循环的res, dividend-resdivisor 进行下一轮循环。
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if divisor==0: return -1
if dividend==0: return 0
neg = (dividend ^ divisor)<0
if dividend==-2**31 and divisor==-1:
return 2**31-1
dividend = abs(dividend)
divisor = abs(divisor)
res=0
for i in range(31, -1, -1):
if (dividend>>i)>=divisor:
res += 1<<i
dividend -= divisor<<i
return res if neg==False else -res