29 兩數相除

2022-06-09 19:42:10 字數 2103 閱讀 4151

給定兩個整數,被除數 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 位有符號整數,其數值範圍是 [−2^31,  2^31 − 1]。本題中,如果除法結果溢位,則返回 2^31 − 1。

看了標籤為二分法,沒有思路,直接看解答:

題目分類提示了二分查詢,那麼按二分查詢的思路去想就行了,既然要求不能使用乘除模運算,那麼就讓除數不斷自加倍增,與被除數對比,倍增過頭了就初始化為原始的除數值再次迴圈倍增,迴圈過程中被除數減去除數不斷減小,直到小於除數為止,其過程就是把二分查詢中的 mid = (left + right) / 2 替換成了divisor * 2,把 left 和 right 替換成了 divisor_tmp 和 divideng_tmp,這樣理解就比較直觀了。

//

傳進div的值必須是正整數,但是int_min取絕對值會產生溢位問題,所以必須對它採取一定的措施,

//即先讓它減一次除數或者加一次除數(主要取決於除數的正負號),然後作為被除數的int_min就不會產生溢位問題了。

int divsub(int dividend, int

divisor)

res += divsub(dividend -divisor, original_divisor);

return

res;

}int divide(int dividend, int

divisor)

dividend = (dividend>0) ? dividend : -dividend;

divisor = (divisor>0) ? divisor : -divisor;

res +=divsub(dividend, divisor);

return (flag) ? res : -res;

}

根據上面的思路,自己寫了**,並測試通過:

int dividesub(int dividend, int

divisor)

res += dividesub(dividend-divisor, originaldiv);

return

res;

}int divide2(int dividend, int

divisor)

return -dividend;

}else

if (divisor ==int_min)

//兩個引數是否同符號

bool samesymbol = (dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0

);

int res = 0

;

if (dividend == int_min) //

下面遞迴時,傳入的都是正數,int_min傳入會溢位,先減或者加上乙個除數

if (dividend < 0

) dividend = -dividend;

if (divisor < 0

) divisor = -divisor;

res +=dividesub(dividend, divisor);

if(samesymbol)

return

res;

return -res;

}

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...