题目:
给定两个整数,被除数 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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
要求不能用乘除和模运算,那就之智能用位运算以及加减了。左移等于乘2,右移等于除以2.
每次让除数左移,直至被除数小于除数。
如:100除以3
100向右移6次小于3,所以除数左移5次。记录当前答案
除数=100-3左移5次=4
答案=初始值0+1左移5次(即3乘的倍数)
4向右移0次才能大于3:
除数=100-3左移0次=1(3左移0次还是自己本身)
答案=刚刚的值+1左移0次
1小于3:
返回答案
代码:
def divide(self, dividend: int, divisor: int) -> int:
if dividend==0 :
return 0
flag=1
if dividend<0<divisor or divisor<0<dividend:
flag=-1
dividend=abs(dividend)
divisor=abs(divisor)
ans,i=0,31
if dividend<divisor:
return 0
while i>=0:
if (dividend>>i)>=divisor:
ans+=1<<i
dividend-=divisor<<i
i=i-1
if flag<0 :
ans=-ans
elif ans>=(2**31)-1 :
return (2**31)-1
elif ans<=-(2**31) :
return -(2**31)
return ans