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