29 兩數相除

2021-10-05 12:34:25 字數 3344 閱讀 4464

29. 兩數相除

難度中等321收藏分享切換為英文關注反饋

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

這道題最初使的一步處理就是將

同號除法處理為絕對值相除的結果

異號除法處理為絕對值相除結果的相反數

由於除法是由減法疊加而來,所以,乍一看乍道題,直接迴圈減就完事了,結果不出意外的超時了。

果然這道題沒有想象的那麼簡單。

考慮到超時的原因是迴圈次數過多,所以想要通過這道題就要減少迴圈次數,這裡我馬上就聯想到了計算機網路中截斷二進位制指數退避演算法,這道題可以用類似的方法,讓每次做減法時不是直接去減divisor,而是減掉乙個span,這個span的大小,初始值為divisor,隨著程式迭代次數而不斷翻倍,直到剩餘的dividend < span ,這個時候將span歸為初始值,然後在迭代的過程中繼續增大。經過這樣的簡單處理之後便可以ac了。

class

solution

:def

divide

(self, dividend:

int, divisor:

int)

->

int:

flag =

false

ifabs

(dividend + divisor)

==abs

(dividend)

+abs

(divisor)

: flag =

true

dividend =

abs(dividend)

divisor =

abs(divisor)

res =

0 span =

while divisor <= dividend:

if dividend < span[

'size']:

span[

'size'

]= divisor

span[

'count']=

1 dividend -= span[

'size'

] res += span[

'count'

] span[

'size'

]+= span[

'size'

] span[

'count'

]+= span[

'count'

] res = res if flag else

-res

if res >2**

31-1:

return2**

31-1elif res <-2

**31

:return-2

**31

else

:return res

執行結果:通過

執行用時 :28 ms, 在所有 python3 提交中擊敗了98.75%的使用者

記憶體消耗 :13.7 mb, 在所有 python3 提交中擊敗了7.69%的使用者

除此之外,還有更直接的方法,即在剛開始減的時候,就先讓span的大小指數增長到能接受的最大值,減掉之後剩餘的部分再使用指數倍增剪掉最大值最後直到求得結果

這兩種方法的時間複雜度是相似的

class

solution

:def

divide

(self, dividend:

int, divisor:

int)

->

int:

flag =

false

ifabs

(dividend + divisor)

==abs

(dividend)

+abs

(divisor)

: flag =

true

dividend =

abs(dividend)

divisor =

abs(divisor)

res =

0while divisor <= dividend:

span =

while span[

'size'

]+ span[

'size'

]< dividend:

span[

'size'

]+= span[

'size'

] span[

'count'

]+= span[

'count'

] dividend -= span[

'size'

] res += span[

'count'

] res = res if flag else

-res

if res >2**

31-1:

return2**

31-1elif res <-2

**31

:return-2

**31

else

:return res

執行結果:通過

執行用時 :40 ms, 在所有 python3 提交中擊敗了73.24%的使用者

記憶體消耗 :13.6 mb, 在所有 python3 提交中擊敗了7.69%的使用者

29 兩數相除

這是數學題題啊,老本行。方法一 可以將除法轉移到對數域 b a eln b a e ln b ln a frac ab eln ab e lnb lna c code class solution 方法二 任何乙個整數可以表示成以2的冪為底的一組基的線性組合.分析 可以對被除數進行分解。以 10 和...

29 兩數相除

參考文獻 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。example 輸入 dividend 10,divisor 3 輸出 3 二進位制遞迴 class solution l...

29 兩數相除

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。整數除法的結果應當截去 truncate 其小數部分,例如 truncate 8.345 8 以及 truncate ...