題目:
給定兩個整數dividend和,不使用乘法、除法和模運算子divisor來除兩個整數。
整數除法應向零方向截斷,這意味著會丟失小數部分。例如,8.345將被截斷為8,而-2.7335將被截斷為-2。
返回除以後的商數。dividenddivisor
注意:假設我們正在處理一個只能儲存32 位元有符號整數範圍內整數的環境:。對於這個問題,如果商嚴格大於,則返回,如果商嚴格小於,則返回。
這題不能用 /,要用「減法 + 位移」模擬除法。
🪜 步驟
處理特殊情況
若 dividend == Integer.MIN_VALUE && divisor == -1 → 溢出 → 回傳 Integer.MAX_VALUE。
統一符號處理
用布林變數 negative 記錄最終結果的正負。
轉成 long 型別避免溢出。
將兩數都轉為正數(取絕對值)。
核心演算法:倍增法(Bit Shifting)
不斷從 dividend 中減去 divisor 的倍數。
透過位移快速找到最大可減的倍數:
while dividend >= divisor:
temp = divisor
multiple = 1
while dividend >= (temp << 1):
temp <<= 1
multiple <<= 1
dividend -= temp
result += multiple
用左移(<<)等價於乘 2,可加速運算。
恢復正負號