力扣29. 兩數相除
阿新 • • 發佈:2020-12-13
技術標籤:java
class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 1) return dividend;
if(divisor == -1 && dividend == Integer.MIN_VALUE){//Integer.MIN_VALUE
return Integer.MAX_VALUE;
}
if(divisor < 0 && dividend < 0){
return divide(-(long)dividend, -(long)divisor);
}
else if(dividend < 0 || divisor < 0){
return -divide(Math.abs((long)dividend), Math.abs((long)divisor));//負號必須放前面
}
else return divide((long)dividend, (long)divisor);
}
public int divide(long dividend, long divisor){
if (dividend < divisor) {
return 0;
}
int count = 1;
long sum = divisor;
while(dividend >= sum){
sum <<= 1;
count <<= 1;
}
sum >>>= 1;//對正數而言,無符號和有符號右移沒有區別
count >>>= 1;//為什麼是無符號右移
return count + divide(dividend - sum, divisor);
}
}
無符號右移:注意負數為整數的補碼:先反碼再+1