29 兩數相除

2021-10-16 16:46:37 字數 3055 閱讀 1482

題目描述

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

−2^−2

31, 2 31−

12^ − 1

231−

1]。本題中,如果除法結果溢位,則返回 231−

12^ − 1

231−1。

題解:不讓用 乘法、除法、取模 運算,那就只能用 減法 嘍。

考慮最基礎的做法:用dividend乙個個的去減divisor,似乎可行?考慮極限情況:div

iden

d=−2

31,di

viso

r=−1

dividend=-2^, divisor=-1

divide

nd=−

231,

divi

sor=

−1,這種情況下,時間複雜度**。

有這麼乙個直觀想法:是不是每次減去的數越大,做減法的次數越少?

那麼我們就可以這樣考慮:

由於:div

iden

ddiv

isor

=k∗d

ivis

or+r

\frac = k * divisor + r

diviso

rdiv

iden

d​=k

∗div

isor

+r,而 k=c

0∗20

+c1∗

21+.

..+c

m∗2m

k = c_0 * 2^0 + c_1 * 2^1 + ... + c_m * 2^m

k=c0​∗

20+c

1​∗2

1+..

.+cm

​∗2m

。題目回到k的二進位制表示上來了,於是我們可以採用倍增的方式預處理divisor2 的整數次冪倍數:21∗

divi

sor,

22∗d

ivis

or,.

..,2

m∗di

viso

r2^1*divisor, 2^2*divisor, ..., 2^m*divisor

21∗div

isor

,22∗

divi

sor,

...,

2m∗d

ivis

or,並且最後一項保證 2m∗

divi

sor≤

divi

dend

2^m*divisor \le dividend

2m∗div

isor

≤div

iden

d。預處理完成後,我們就可以從高位到低位做減法:如果 div

iden

ed

>=2

d∗di

viso

rdividened >= 2^d*divisor

divide

ned>=2

d∗di

viso

r ,那麼k的第d+1位肯定為 1 。

為了方便處理,我們使用sign記錄兩數相除後的符號,然後轉換成正數來計算。

同時,因為 −231

-2^−2

31轉為正數,若用int來儲存,會溢位,所以考慮使用long long儲存。

**:

class

solution}if

( ret > int_max ||

( sign &&

-ret < int_min )

)return int_max;

return sign ?

-ret : ret;}}

;/*記憶體:6mb,擊敗:91.96%

*/

上面的**使用long long的主要原因是因為 −231

-2^−2

31轉為正數的時候會產生溢位,如果我們把數字都轉為負數處理,可以不用long long

具體見**:

class

solution

int ret =0;

for(

int i = exp.

size()

-1; i >=0;

--i )

}return sign ?

-ret : ret;}}

;/*記憶體:6mb,擊敗:92.52%

*/

貼乙個高階版本:

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 兩數相除

29.兩數相除 難度中等321收藏分享切換為英文關注反饋 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。整數除法的結果應當截去 truncate 其小數部分,例如 truncat...