📘 題目敘述
給你兩個整數 dividend 和 divisor,請在不使用乘法、除法、取模運算子的情況下完成相除,並回傳商(quotient)。
整數除法需朝 0 截斷(truncate toward zero)。若超出 32-bit 有號整數範圍,回傳邊界值。
條件限制
-2^31 <= dividend, divisor <= 2^31 - 1divisor != 0
🧠 解題思路
核心想法是使用「加倍(doubling)」加速減法:每輪找出最大的 temp = b * 2^t,使得 temp <= a,再一次扣掉這大塊並把對應倍數加入答案。
兩個重點:
- 溢位特例:
INT_MIN / -1會超出INT_MAX,直接回傳INT_MAX。 - 正負號:用 XOR 判斷答案是否為負數。
所有變數
dividend:被除數divisor:除數sign:答案是否為負數a:dividend的絕對值(long long)b:divisor的絕對值(long long)ans:累積商temp:當前可扣除的加倍除數mul:temp對應倍數
🪜 主要流程步驟
- 先處理唯一溢位特例:
INT_MIN / -1直接回傳INT_MAX。 - 計算正負號,並把被除數/除數轉成絕對值。
- 外層迴圈在
a >= b時持續進行:- 內層用加倍找到最大的
temp(temp + temp <= a)。 - 更新
a -= temp、ans += mul。
- 內層用加倍找到最大的
- 依
sign回傳-ans或ans。
💻 程式碼實作
class Solution {
public:
int divide(int dividend, int divisor) {
if (dividend == INT_MIN && divisor == -1) {
return INT_MAX;
}
bool sign = (dividend > 0) ^ (divisor > 0); // XOR, true為負
long long a = llabs((long long)dividend);
long long b = llabs((long long)divisor);
long long ans = 0;
while (a >= b) {
long long temp = b;
long long mul = 1;
while (temp + temp <= a) {
temp += temp;
mul += mul;
}
a -= temp;
ans += mul;
}
return (sign ? -ans : ans);
}
};
🔗 題目連結
https://leetcode.com/problems/divide-two-integers/