29. Divide Two Integers

一、题目

  1、审题

    

  2、分析

    不适使用乘除、取余符号,求 int 型被除数除以除数所得的商。其中,商可能涉及溢出 int 范围。

二、解答

  1、思路:

    a、int 型数据范围为 -2147483648 到 2147483647 。故,当商为 2147483648时,整数无法表示,故想办法将被除数与除数换成 long 型进行计算。即另外写一个满足的方法;

    b、进行除法运算时,采用 被除数循环减去除数来计算减去的趟数时,抛出运行超时异常。故每次减去的除数应该依次扩大。

    c、 n 为int 型时, Math.abs(-2147483648) 仍等于 -2147483648;

class Solution {
    public int divide(int dividend, int divisor) {

        long result = divideLog(dividend, divisor);

        if(result > Integer.MAX_VALUE)
            return Integer.MAX_VALUE;

        return (int)result;
    }
    
    private long divideLog(long dividend, long divisor) {

        if(dividend == divisor)
            return 1;

        boolean isNegative = (dividend < 0) != (divisor < 0);   // 判断是否两数异号
        dividend = dividend > 0 ? dividend : -dividend;     // 取正
        divisor = divisor > 0 ? divisor : -divisor;

        if(dividend < divisor || divisor == 0)
            return 0;

        long result = 1, sum = divisor;
        while((sum + sum) <= dividend) {
            sum += sum;
            result += result;
        }

        if(isNegative)
            return -(result + divideLog(dividend - sum, divisor));
        else
            return result + divideLog(dividend - sum, divisor);
    }
}
原文地址:https://www.cnblogs.com/skillking/p/9433490.html