Leetcode029 divide-two-integers

本文详细解析了一种不使用乘法、除法和模运算符实现两数相除的算法,通过移位运算和逐步减法求得商,特别适用于32位有符号整数环境,避免了溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两数相除

题目描述:

给定两个整数,被除数 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。

解题思路:

考察定点数的移位运算操作

<< 左移动运算符运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。

核心的思想是通过被除数不断地减去除数,知道余数比除数小的时候停止

  • 通过移位运算,先得到除数的32位二进制数的移位数,而该移位数是在所有小于被除数的32位二进制数中最大的,然后存储该移位数的十进制值tmp,同时保存此时的移位数值quotient
  • 继续移位,缩小移位数,如果满足条件 t m p + 当 前 移 位 数 &lt; = 被 除 数 tmp + 当前移位数 &lt;= 被除数 tmp+<=,则增加移位数值( q u o t i e n t ∣ = 1 &lt; &lt; i quotient |= 1 &lt;&lt; i quotient=1<<i
  • 另外建立一个判断正负的参数sign,作为答案的正负考量值

Python源码:

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        if dividend == 0: return 0 
        if divisor == 0: return 0
        
        sign = -1 if ((dividend < 0) ^ (divisor < 0)) else 1
        dividend = abs(dividend)
        divisor = abs(divisor)
        
        quotient = 0 
        tmp = 0 
        for i in range(32,-1,-1):
            m = tmp + (divisor << i)
            n = divisor << i
            if tmp + (divisor << i) <= dividend:
                tmp += divisor << i 
                quotient |= 1 << i
        
        quotient *= sign    #虽然题目说了不要用乘法,但是为了代码的简洁这里还是用了
        if quotient < -(2 ** 31) or quotient > 2 ** 31 - 1:
            return 2 ** 31 - 1
        else:
            return quotient

欢迎关注我的github:https://github.com/UESTCYangHR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值