Divide Two Integers

来源:互联网 发布:网络高清硬盘播放机 编辑:程序博客网 时间:2024/06/05 08:11

原题:

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

即不通过乘法、除法、乘方实现两个数相除。


思考过程:

一开始想的是累减的办法,结果超时了:

public int divide1(int dividend, int divisor) {        if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;        int res = 0,beiChuShu = Math.abs(dividend),chuShu = Math.abs(divisor);        while (beiChuShu >= chuShu){            beiChuShu -= chuShu;            res++;        }        if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) return res;        else return 0 - res;    }

后来看到别人思路,是第一次减去除数,第二次减去除数两倍(通过位运算实现),以此类推,直到被除数小于位运算多次的除数,这时让除数恢复原来的值,重复上述过程。
我受启发,想到先把除数通过位运算多次翻倍,直到divisor + dibisor >divident > divisor,然后进行累减。结果超时了(很不明白为什么会超时,我觉得这个时间复杂度不比上一个大。):
public int divide2(int dividend, int divisor) {        long res = 0,beiChuShu = Math.abs(dividend),chuShu = Math.abs(divisor);        if (dividend == Integer.MIN_VALUE) {            if (divisor == -1) return Integer.MAX_VALUE;            else beiChuShu = (long)Integer.MAX_VALUE + 1;        }        long mulOfDivisor = 1;        while (beiChuShu - chuShu >= chuShu){            chuShu = chuShu<<1;            mulOfDivisor = mulOfDivisor<<1;        }        while (mulOfDivisor >= 1){            if (beiChuShu >= chuShu) {                beiChuShu -= chuShu;                res += mulOfDivisor;            }            chuShu = chuShu>>1;            mulOfDivisor = mulOfDivisor>>1;        }        return (int) (((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))? res:(0 - res));    }


最后乖乖按照上一个思路来的:

public int divide(int dividend, int divisor) {        if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;        long res = 0,beiChuShu = Math.abs((long) dividend),chuShu = Math.abs((long) divisor),mulOfDivisor = 1;        while (beiChuShu >= chuShu){            long l = chuShu;            mulOfDivisor = 1;            while (beiChuShu >= l){                beiChuShu -= l;                res += mulOfDivisor;                l = l<<1;mulOfDivisor = mulOfDivisor<<1;            }        }return (int) (((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))? res:(0 - res));    }


原创粉丝点击