29. 两数相除

2022-01-09  本文已影响0人  名字是乱打的

一 题目:

二 思路:

采用二分法的思想,dividend每次减去2^n个divisor(尽可能多),同时reslut每次加2^n

三 代码:

class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend==Integer.MIN_VALUE&&divisor==-1){
            return Integer.MAX_VALUE;
        }

        //判断符号是否一致
        //这里不能用两者的乘法做运算,因为可能会移除变负数;
        boolean same= (dividend>0&&divisor>0||dividend<0&&divisor<0)?true:false;

        // 将被除数和除数都转成正数或负数进行计算
        // 由于在Java中,当t=Integer.MIN_VALUE时(t取相反数依旧是它本身)此时可能存在越界问题,因此都用负数进行计算
        dividend=-Math.abs(dividend);
        divisor=-Math.abs(divisor);
        int res=0;
        while (dividend<=divisor){
            int temp=divisor;
            //记录有多少个divisor
            int count=1;
            //dividend每次减去2^n个divisor(尽可能多),同时reslut每次加2^n
            while (dividend-temp<=temp){
                //temp*2,count*2;
                temp=temp<<1;
                count=count<<1;
            }
            //减去2的n次方个divisor
            dividend=dividend-temp;
            res=res+count;
        }
        return same? res:-res;
    }
}
上一篇下一篇

猜你喜欢

热点阅读