Java 演算法-兩個整數相除(二分法)

weixin_34248118發表於2018-01-11

  每天都要督促自己做面試題!

題意:
將兩個整數相除,要求不使用乘法、除法和 mod 運算子。

如果溢位,返回 2147483647 。
樣例:
給定被除數 = 100 ,除數 = 9,返回 11。

  這個題說實話,如果直接除以的話,不難的,但是題上說了不能使用乘法和除法,所以只有使用加減法,但是加減法有太慢了,所以想到了位運算,<<1表示左移一位,表示乘以2。

1.解題思路

  我們將被除數迴圈減去除數(這個是要變得),減過一次,如果被除數>=除數的話,就讓除數乘以2(<<1),並且增量也要乘以2,因為倍數原來的兩倍。
  我們假設,result 用來記錄最終的結果,cnt表示每次的增量,temp表示變換的除數,每次被除數減去temp之後,cnt<<1,同時temp<<1。
  說的我都有點亂了,直接看程式碼

2.程式碼

public  int divide(int dividend, int divisor) {
        if(divisor == 0) {
            return 2147483647;
        }
        long result  = 0;
        long d1 = Math.abs((long)dividend);
        long d2 = Math.abs((long)divisor);
        while(d1 >= d2) {
        
            long temp = d2; //變換的除數
            long cnt = 1; //增量
            while(d1 >= temp) {
                //如果被除數大於等於temp(變換的除數),result += cnt
                result += cnt;
                d1 -= temp; //被除數減去除數
                cnt = cnt << 1;
                temp = temp << 1;
            }
        }
        if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0) {
            result = -result;
        }
        if(result < Integer.MIN_VALUE || result > Integer.MAX_VALUE) {
            result = 2147483647;
        }
        return (int) result;
    }

相關文章