Divide Two Integers
問題簡介:給定兩個整數被除數和除數,運算過程中不使用乘法,除法和模運算符,傳回商,dividend是被除數,divisor是除數.
注:
1.被除數和除數都是32位有符号整數
2.除數永遠不會為0
3.假設我們正在處理一個隻能在32位有符号整數範圍記憶體儲整數的環境:[ - 231,231 - 1],出于此問題的目的假設當除法結果溢出時,函數傳回231 - 1.
舉例:
1:
輸入: dividend = 10, divisor = 3
輸出: 3
2:
輸入: dividend = 7, divisor = -3
輸出: -2
解法一:
利用異或^判斷商的符号,即隻有一個數字為負結果為負,利用位運算符<<進行運算,因為<<代表2的幂數
class Solution {
public int divide(int dividend, int divisor) {
if (divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1))
return Integer.MAX_VALUE;
long m = Math.abs((long)dividend);
long n = Math.abs((long)divisor);
long res = 0;
long sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
if (n == 1) return (int)(sign == 1 ? m : -m);
while (m >= n) {
long t = n, p = 1;//記錄2的倍數即結果
while (m >= (t << 1)) {
t <<= 1;
p <<= 1;
}
res += p;
m -= t;
}
return (int)(sign == 1 ? res : -res);
}
}
注:
1.Integer.MAX_VALUE/Integer.MIN_VALUE:代表int的範圍
2.Math.abs()-絕對值函數
小白刷題之路,請多指教— — 要麼大器晚成,要麼石沉大海