Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

Analysis

  • 不可以用*,/,mode,可以用+
  • 注意换算成long,不然容易overflow
  • 注意sign
  • 每次把divisor*2,知道大于dividend,记录乘了多少数
  • Example:
    • 16/5: 5x2x2>16,记录divide为2
    • 16-5x2 = 6
    • 6/5: 5x2>6,记录divide为1
    • 答案为所有divide相加 1+2=3

Code

public class Solution {
    public int divide(int dividend, int divisor) {
        long result = divideLong(dividend, divisor);
        return result>Integer.MAX_VALUE?Integer.MAX_VALUE:(int)result;
    }

    private long divideLong(long dividend, long divisor){
        boolean sign = dividend < 0 != divisor < 0;

        if(dividend<0){dividend = - dividend;}
        if(divisor<0){divisor = -divisor;}

        if(dividend<divisor) {return 0;}

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

        return sign ? -(divide+divideLong((dividend-sum),divisor)):(divide+divideLong((dividend-sum), divisor));
    }
}

Reference

Leetcode