leetcode 29 兩數相除

2021-10-07 18:15:05 字數 1254 閱讀 8638

給定兩個整數,被除數 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說...