LeetCode 兩數相除

2021-08-21 19:31:43 字數 1926 閱讀 7158

題目:

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