https://leetcode.cn/problems/divide-two-integers/
給你兩個(gè)整數(shù)诺擅,被除數(shù) dividend 和除數(shù) divisor购撼。將兩數(shù)相除进胯,要求 不使用 乘法脓魏、除法和取余運(yùn)算刽酱。
整數(shù)除法應(yīng)該向零截?cái)啵簿褪墙厝ィ╰runcate)其小數(shù)部分罢防。
例如暑竟,8.345 將被截?cái)酁?8 ,-2.7335 將被截?cái)嘀?-2 症概。
返回被除數(shù) dividend 除以除數(shù) divisor 得到的 商 蕾额。
注意:假設(shè)我們的環(huán)境只能存儲(chǔ) 32 位 有符號(hào)整數(shù),其數(shù)值范圍是 [?231, 231 ? 1] 彼城。
本題中诅蝶,如果商 嚴(yán)格大于 231 ? 1 退个,則返回 231 ? 1 ;如果商 嚴(yán)格小于 -231 调炬,則返回 -231 语盈。
示例 1:
輸入: dividend = 10, divisor = 3
輸出: 3
解釋: 10/3 = 3.33333.. ,向零截?cái)嗪蟮玫?3 缰泡。
示例 2:
輸入: dividend = 7, divisor = -3
輸出: -2
解釋: 7/-3 = -2.33333.. 刀荒,向零截?cái)嗪蟮玫?-2 。
代碼
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
if (divisor == 1) {
return dividend;
}
if (divisor == -1) {
return dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE : -dividend;
}
boolean isSame = (dividend < 0 && divisor < 0) || (dividend > 0 && divisor > 0);
//取絕對(duì)值進(jìn)行計(jì)算棘钞,無(wú)需判斷誰(shuí)正誰(shuí)負(fù)
long dividendLong = dividend > 0 ? dividend : dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE+1L : -dividend;
long divisorLong = divisor > 0 ? divisor : divisor == Integer.MIN_VALUE ? Integer.MAX_VALUE+1L : -divisor;
long count = 0;
while (dividendLong >= divisorLong) {
//每次翻倍-缠借,超過(guò)重頭開(kāi)始
long temp = divisorLong;
long tempCount = 1;
while (true) {
if (dividendLong < temp) {
break;
}
tempCount += tempCount;
dividendLong -= temp;
temp += temp;
}
//-1是由于每次滿足條件都會(huì)多加第一次的1
count += tempCount - 1;
}
return (int) (isSame ? count : -count);
}
}