leetcode29. 两数相除

给定两个整数,被除数 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,是因为先判断了是否溢出后做的正负号判断。逻辑前后颠倒导致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值