给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
sign=True if dividend^divisor >=0 else False #异或判断结果正负号
dividend,divisor=abs(dividend),abs(divisor) #取绝对值运算
res=0 #返回的result结果
while divisor<=dividend: #除数比被除数小的时候
tem,count=divisor,1 #临时除数变量tem
while tem<=dividend: #临时除数小鱼被除数继续运算
res=count+res #res计算被除数中循环到现在已经有了多少个除数
dividend=dividend-tem #被除数减去除数,因为那个已经被计算了
count<<=1 #count左移一位,因为不能用乘除
tem<<=1 #tem左移一位
res=res if sign else -res #最后结果的正负号
res = max(min(res,2**31-1),-2**31) #判断是否溢出
return res
总结:在做这道题的时候,虽然运算不难,但是花了不少时间。问题总结如下:
1.用<< 左移的时候,没有写成<<=,没有赋值成功。符号用的粗心导致。
2.提交之后,溢出的时候总是和预期结果差了1,是因为先判断了是否溢出后做的正负号判断。逻辑前后颠倒导致。