一、题目
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); } }