Java 算法-两个整数相除(二分法)

  每天都要督促自己做面试题!

题意:
将两个整数相除,要求不使用乘法、除法和 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;
    }

你可能感兴趣的:(Java 算法-两个整数相除(二分法))