1. 程式人生 > 其它 >[LeetCode] #29 兩數相除

[LeetCode] #29 兩數相除

[LeetCode] #29 兩數相除

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數 dividend 除以除數 divisor 得到的商。

整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

輸入: dividend = 10, divisor = 3

輸出: 3

解釋: 10/3 = truncate(3.33333..) = truncate(3) = 3

解法一

class Solution {
    public int divide(int dividend, int
divisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; if (dividend == Integer.MAX_VALUE && divisor == 1) return Integer.MAX_VALUE; int result = 0; boolean isNeg = (dividend < 0 ^ divisor < 0); dividend = -Math.abs(dividend); divisor
= -Math.abs(divisor); while (dividend <= divisor) { int d = divisor; int cnt = 1; while (dividend <= d && d >= -1073741824) { d = d << 1; cnt = cnt << 1; } if (dividend <= d) { dividend
-= d; result += cnt; } else { dividend -= d >> 1; result += cnt >> 1; } } return isNeg ? -result : result; } }

解法二

class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
        if (dividend == Integer.MAX_VALUE && divisor == 1) return Integer.MAX_VALUE;
        int res = 0;
        boolean isNeg = (dividend < 0 ^ divisor < 0); 
        dividend = -Math.abs(dividend);
        divisor = -Math.abs(divisor);
        if(divisor < -1){
            while(dividend <= divisor){
                int tmp = 1;
                int div = divisor;
                while(div >= dividend - div){
                    div = div<<1;
                    tmp = tmp<<1; 
                }
                res += tmp;
                dividend -= div;
                
            }
        }else{
            res = 0 - dividend;
        }
        return isNeg ? -res : res;
    }
}

知識點:

總結: