題目描述
給定兩個整數,被除數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
的二進位制表示上來了,於是我們可以採用倍增的方式預處理divisor
2 的整數次冪倍數: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...