29

发布时间 2023-09-17 16:38:42作者: zhouzhou0615
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;

    }
}