两数相除
题目描述:
给定两个整数,被除数 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 + 当 前 移 位 数 < = 被 除 数 tmp + 当前移位数 <= 被除数 tmp+当前移位数<=被除数,则增加移位数值( q u o t i e n t ∣ = 1 < < i quotient |= 1 << 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