LeetCode 29 兩數相除

2021-09-25 20:35:40 字數 1637 閱讀 6981

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

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

示例 1:

輸入: dividend = 10, divisor = 3

輸出: 3

示例 2:

輸入: dividend = 7, divisor = -3

輸出: -2

說明:

/**

* 解題思路:這題是除法,所以先普及下除法術語

* 商,公式是:(被除數-餘數)÷除數=商,記作:被除數÷除數=商...餘數,是一種數學術語。

* 在乙個除法算式裡,被除數、餘數、除數和商的關係為:(被除數-餘數)÷除數=商,記作:被除數÷除數=商...餘數,

* 進而推導得出:商×除數+餘數=被除數。

* * 要求商,我們首先想到的是減法,能被減多少次,那麼商就為多少,但是明顯減法的效率太低

* * 那麼我們可以用位移法,因為計算機在做位移時效率特別高,向左移1相當於乘以2,向右位移1相當於除以2

* * 我們可以把乙個dividend(被除數)先除以2^n,n最初為31,不斷減小n去試探,當某個n滿足dividend/2^n>=divisor時,

* * 表示我們找到了乙個足夠大的數,這個數*divisor是不大於dividend的,所以我們就可以減去2^n個divisor,以此類推

* * 我們可以以100/3為例

* * 2^n是1,2,4,8...2^31這種數,當n為31時,這個數特別大,100/2^n是乙個很小的數,肯定是小於3的,所以迴圈下來,

* * 當n=5時,100/32=3, 剛好是大於等於3的,這時我們將100-32*3=4,也就是減去了32個3,接下來我們再處理4,同樣手法可以再減去乙個3

* * 所以一共是減去了33個3,所以商就是33

* * 這其中得處理一些特殊的數,比如divisor是不能為0的,integer.min_value和integer.max_value

* */

/**

* @author: dfpeng

* @date: 2019/8/3 23:32

*/public

class

solution

if(dividend == integer.min_value && divisor ==-1

)boolean negative;

negative =

(dividend ^ divisor)

<0;

long t = math.

abs(

(long

) dividend)

;long d = math.

abs(

(long

) divisor)

;int result =0;

for(

int i =

31; i >=

0; i--)}

return negative ?

-result : result;

}}

LeetCode29 兩數相除

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

LeetCode 29 兩數相除

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

leetcode 29 兩數相除

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