【leetcode系列】【算法】【中等】两数相除

题目:

原题链接: https://leetcode-cn.com/problems/divide-two-integers/

 

解题思路:

根据除数(a)和被除数(b)的正负号,判断最终结果的正负

然后使用除数和被除数的绝对值进行计算

 

计算的时候,当b > a时,对a进行自加的操作,即a = a + a,第一次相当于×2,第二次×4,直到b < a + a的时候,更新b = b - a, a = 原始值

重复此步骤,直到b < 原始a,退出循环

除此之外,再加一个是否溢出int最大值的判断

如果溢出,则返回int最大值

 

代码实现:

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        int_range = [2 ** 31 - 1, 2 ** 31]
        sign = 0
        if dividend < 0 and divisor > 0:
            sign = 1
        elif dividend > 0 and divisor < 0:
            sign = 1
        elif dividend == 0 or divisor == 0:
            return 0

        a, b = abs(dividend), abs(divisor)
        res = 0
        def get_div(a, b):    
            if a < b:
                return 0
        
            tb = b
            tmp_res = 1
            while a >= tb + tb:
                tmp_res = tmp_res << 1
                tb = tb << 1
                
            return tmp_res + get_div(a - tb, b)

        res = get_div(a, b)
        if res > int_range[sign]: res = int_range[sign]
        if sign == 1: res = 0 - res
        return res

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值