給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。
返回被除數 dividend 除以除數 divisor 得到的商。
整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:
輸入: dividend = 10, divisor = 3
輸出: 3
解釋: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例 2:
輸入: dividend = 7, divisor = -3
輸出: -2
解釋: 7/-3 = truncate(-2.33333..) = -2
被除數和除數均為 32 位有符號整數。
除數不為 0。
假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。本題中,如果除法結果溢位,則返回 231 − 1。
乘除運算可以通過位運算實現,左移一位*2,右移一位/2。
class solution:
def divide(self, dividend: int, divisor: int) -> int:
# 計算邊界值[-2**32,2**32-1]
val_max = (1 << 31) - 1
val_min = -(1 << 31)
# 異或操作確定最終輸出資料的符號
sign = (dividend > 0) ^ (divisor > 0)
a = abs(dividend)
b = abs(divisor)
res = 0
while a >= b:
temp = b
count = 1
# 除數每次擴大2倍,直到大於被除數,
# 記錄擴大的次數。
while (temp << 1 ) <= a:
temp <<= 1
count <<= 1
a -= temp
# 前面都是2倍放大,考慮不足2倍的情況。
# 記錄最後的結果
res += count
if sign :
return max(val_min, -res)
else:
return min(val_max, res)
LeetCode29 兩數相除
給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出 2說...
LeetCode 29 兩數相除
給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividend 7,divisor 3 輸出...
leetcode 29 兩數相除
給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出 2說...