題目描述
給定兩個整數,被除數 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。
思路解析
非常簡單的思路就是除數-被除數的次數,有多少就是多少
但是會出現一個問題,就是被除數很小,除數很大,時間復雜過高,利用位運算加速。
被除數每次翻倍,結果也翻倍
當不能翻倍的時候,回歸開始,重復計算
class Solution:
def divide(self, a, b):
'''
正負號
越界
=0
:param a:
:param b:
:return:
'''
sign = 1 if a ^ b >= 0 else -1
a = abs(a)
b = abs(b)
if b == 0 or a < b:
return 0
res = 0
while a >= b:
temp, add = b, 1
while a >= temp:
a -= temp
res += add
add <<= 1
temp <<= 1
res *= sign
if res > 2 ** 31 - 1:
return 2 ** 31 - 1
if res < -2 ** 31:
return -2 ** 31
return res
AC29