29

public class Divide {

    static final int MAX = Integer.MAX_VALUE;
    static final int MIN = Integer.MIN_VALUE;

    public int divide(int dividend, int divisor) {

        // 溢出的情况
        if (dividend == MIN && divisor == -1) {
            return MAX;
        }

        // 记录符号位
        int sign = -1;
        if ((dividend > 0 && divisor >0) || (dividend < 0 && divisor < 0)) {
            sign = 1;
        }

        // 全部转换成负数 防止溢出 因为负数比正数范围更大 -128 -  127
        dividend = dividend > 0 ? -dividend : dividend;
        divisor = divisor > 0 ? -divisor : divisor;

        int ans = 0;

        // 都是负数的时候 比较正好相反
        while (dividend <= divisor) {
            
            // 每次递增的数
            int temp = divisor, count = 1;

            // 除完有余数 说明最少是2倍大小
            while (temp >= dividend - temp) {
                temp += temp; // 每次需要多减去一个除数
                count += count; // 商累加
            }
            dividend -= temp; // 每次需要多减去一个除数 
            ans += count; // 计算商
        }

        return sign < 0 ? -ans : ans;

    }
}

 

自己模仿别人写的倍增法

class Solution {
    public int divide(int dividend, int divisor) {
        // 考虑被除数为最小值的情况
        if (dividend == Integer.MIN_VALUE) {
            if (divisor == 1) {
                return Integer.MIN_VALUE;
            }
            if (divisor == -1) {
                return Integer.MAX_VALUE;
            }
        }
        // 考虑除数为最小值的情况
        if (divisor == Integer.MIN_VALUE) {
            return dividend == Integer.MIN_VALUE ? 1 : 0;
        }
        // 考虑被除数为 0 的情况
        if (dividend == 0) {
            return 0;
        }
        long ans = 0;
        int sign = ((dividend ^ divisor) >> 31 & 1) == 1 ? -1 : 1;
        long dividendLong = Math.abs((long)dividend);
        long divisorLong = Math.abs((long)divisor);
        while(dividendLong >= divisorLong) {
            long ansTmp = 1;
            long tmp = divisorLong;
            while(dividendLong >= tmp) {
                dividendLong -= tmp;
                ans += ansTmp;
                ansTmp = ansTmp << 1;
                tmp = tmp << 1;
            } 
        }
        return (int)ans * sign;
    }


}

  

 

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

        //使用异或判断结果的正负号
        boolean negative=(dividend ^ divisor)<0;
        int res=0;
        //转换为正数    
        long div=Math.abs((long) dividend),divs=Math.abs((long) divisor);
        while(div >= divs) {
            int sum = 0;
            int cnt = 1;
            long target = divs;
            while(div >= target) {
                div -= target;
                target = 2 * target;
                sum += cnt;
                cnt = cnt * 2;
            }
            res += sum;
        }
        return negative?-res:res;
    }
}

  

  

posted on 2023-09-17 16:32  zhouzhou0615  阅读(9)  评论(0编辑  收藏  举报

导航