題目:
給定兩個整數,被除數dividend
和除數divisor
。將兩數相除,要求不使用乘法、除法和 mod 運算子。
返回被除數dividend
除以除數divisor
得到的商。
示例 1:
輸入:dividend = 10, divisor = 3輸出:3示例 2:
輸入:dividend = 7, divisor = -3輸出:-2說明:
思想:
以前cpu沒有乘除法運算單元的時候就是用加減法實現乘除的,所以這裡也是一樣用減法就ok了,但是我們一般就想到每次減除數,但是這個方案會超時,那怎麼辦呢,又要減法,但是減除數又超時,那只能增大減去部分的大小了,增大的話不能用乘法,就只剩下移位的,左移的話就是除數*2,那我們減去這個除數*2,就相當於商+1*2,如果在乙個迴圈裡移位找到小於被除數最大的減去部分的數的話,將大大減小我們的時間。
**:
class solution:
def divide(self, dividend, divisor):
""":type dividend: int
:type divisor: int
:rtype: int
"""negative_flag = false
if divisor <0 and dividend>0 :
divisor*=-1
negative_flag = true
elif divisor >0 and dividend<0 :
dividend*=-1
negative_flag = true
elif divisor <0 and dividend<0:
divisor *=-1
dividend*=-1
else:
negative_flag=false
if divisor == dividend:
if negative_flag == true:
return -1
return 1
#上面是一些正負號處理和其他條件處理,本人不才,做不到簡潔
shang = 0
yu = dividend
cnt = 1
while(yu >= divisor):#餘數小於除數的時候,說明不能繼續除了
temp = divisor#最大的減數
cnt =1
while temp<=yu:#尋找最大的減數
temp <<=1
cnt <<=1 #除數*2,那我們的商也要加上*2的數
temp >>=1#因為上面迴圈條件是大於就跳出,所以這裡要還原一下
cnt >>=1
shang +=cnt #加上商
yu -=temp
#下面是一些條件處理
if negative_flag==true:
if shang >2147483648:
return 0
return shang*-1
if shang>2147483647:
return 0
return shang
if __name__ =="__main__":
res = solution()
print(res.divide(-2147483648,-1));
pass
LeetCode 兩數相除
給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividend 7,divis...
LeetCode 兩數相除
給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividend 7,divis...
leetcode 兩數相除
兩數相除跳轉 相同的值,直接返回 if dividend divisor return flag 1 1 大於半數的值,直接返回 if divisor integer.min value 1 dividend divisor return flag 1 1 尋找到乙個最大的除數的倍數 int i f...