給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算符。
返回被除數 dividend 除以除數 divisor 得到的商。
示例 1:
輸入: dividend = 10, divisor = 3 輸出: 3 示例 2:
輸入: dividend = 7, divisor = -3 輸出: -2 說明:
被除數和除數均爲 32 位有符號整數。 除數不爲 0。 假設我們的環境只能存儲 32 位有符號整數,其數值範圍是 [−2^31, 2^31 − 1]。本題中,如果除法結果溢出,則返回 2^31 − 1。
public static int divide(int dividend, int divisor) {
//除數-0的處理
if (divisor == 0) {
return Integer.MAX_VALUE;
}
//除數=最小整型數的處理
if (divisor == Integer.MIN_VALUE) {
if (dividend == Integer.MIN_VALUE) {
return 1;
}
return 0;
}
//被除數=最小整型數且除數=-1,結果溢出的處理
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
//被除數=0直接返回0
if (dividend == 0) {
return 0;
}
//被除數、除數正負位標誌
boolean negtive1 = true;
boolean negtive2 = true;
//判斷是否爲正數
if ((dividend & 0x80000000) == 0) {
negtive1 = false;
//變爲負數
dividend = ~dividend + 1;
}
if ((divisor & 0x80000000) == 0) {
negtive2 = false;
divisor = ~divisor + 1;
}
//記錄最終結果的正負
if (negtive1 && negtive2 || !negtive1 && !negtive2) {
negtive1 = false;
} else {
negtive1 = true;
}
int target = 0;
int countBit = 0;
int temp = divisor;
//模擬除法運算,先找到除數最大可以左移到多少
while (dividend <= temp) {
//當temp<= -2的29次方,持續翻倍
if (temp >= 0xf0000000) {
temp <<= 1;
//防止左移去掉了符號位
temp |= 0x80000000;
countBit++;
} else {
break;
}
}
//模擬除法逐位的運算
while (countBit >= 0 && dividend <= divisor) {
int count = 0;
//由於都是負數,所以被除數應該小於等於temp
while (dividend <= temp) {
count++;
dividend -= temp;
}
//做了多少次減法,就是該位除之後的結果
target += (count << countBit);
countBit--;
temp >>= 1;
}
//變爲負數
if (negtive1) {
target = ~target + 1;
}
return target;
}