LeetCode 029 兩數相除

2021-10-10 22:40:40 字數 1799 閱讀 2600

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數 dividend 除以除數 divisor 得到的商。

整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

被除數為0直接返回0

除數為1直接返回被除數

除數為-1時, 如果被除數是整型最小值, 則返回整型最大值(整型最小值取相反數會溢位), 否則返回被除數的相反數

其餘結果

記錄結果正負, 也就是看被除數和除數的正負情況, 同號為正, 反之為負

將被除數和除數取絕對值, 在遞迴方法中計算, 返回絕對值的計算結果

根據上面記錄的正負結果, 返回最後結果

遞迴方法

舉例:10 / 3, 比較10和3的大小, 10比3大, 則商必定大於1, 然後將3翻倍為6, 比較10和6, 還是10大, 則商必定大於2, 再將6翻倍為12, 現在是10小, 所以最終結果必定在2到4之間, 不妨將10 - 6 = 4, 比較4於3, 4大, 則結果至少為2 + 1 = 3, 將3翻倍為6, 4小於6, 於是重複類似的操作, 4 - 3 = 1, 1小於3, 直接返回2 + 1 + 0 = 3 為最終結果, 看**會清晰得多

int a = integer.min_value;

system.out.

println

(a -1)

;// 整型最小值 - 1 = 整型最大值

class

solution

if(divisor ==1)

if(divisor ==-1

)// 記錄結果正負的符號

int sign =1;

if(dividend >

0&& divisor <

0|| dividend <

0&& divisor >0)

// 原先採用絕對值來計算, 但是整數最小值取相反數會溢位

// 所以將數統統置為負數, 直接用兩個負數計算

dividend = dividend >0?

-dividend : dividend;

divisor = divisor >0?

-divisor : divisor;

int result =

div(dividend, divisor)

;return sign ==

1? result :

-result;

}private

intdiv

(int dividend,

int divisor)

// 被除數比除數小(絕對值大), 則被除數至少有1個除數(數值比較)

// count記錄被除數的數值等於幾個除數

int count =1;

// 既然count至少為1, 那就嘗試讓除數翻倍, 看看count能否達到2

int curdivisor = divisor;

while

(dividend < curdivisor + curdivisor && curdivisor + curdivisor <0)

// 還需要檢查dividend減去curdivisor後是否還能包括幾個divisor

return count +

div(dividend - curdivisor, divisor);}

}

LeetCode 029 兩數相除

029 兩數相除 給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。示例 1 輸入 dividend 10,divisor 3 輸出 3 示例 2 輸入 dividen...

LeetCode029 兩數相除

給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出 2說...

LeetCode 兩數相除

題目 給定兩個整數,被除數dividend和除數divisor。將兩數相除,要求不使用乘法 除法和 mod 運算子。返回被除數dividend除以除數divisor得到的商。示例 1 輸入 dividend 10,divisor 3輸出 3示例 2 輸入 dividend 7,divisor 3輸出...