LeetCode 29. Divide Two Integers

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

If it is overflow, return MAX_INT.

题目大意:

两个数相除不用乘号,除号和求余运算符。

题目思路:

判断除数与被除数的正负,若为负转化为正数。

divideLong函数实现:商由1-2-4-8-16慢慢递增,直到2sum大于dividend被除数

最后得到的商为多个divideLong返回和。

如:10 /3

divideLong(10,3)

divisor 1   sum=3   3+3<=10

divisor 1+1=2 sum=6  6+6>10

divideLong(10-6,3)

divisor 1  sum=3 3+3>4

divideLong(1,3)

return 0

result=2+1=3

AC代码:

Java:

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


    // It‘s easy to handle edge cases when
    // operate with long numbers rather than int
    public long divideLong(long dividend, long divisor) {
        
        // Remember the sign
        boolean negative = dividend < 0 != divisor < 0;
        
        // Make dividend and divisor unsign
        if (dividend < 0) dividend = -dividend;
        if (divisor < 0) divisor = -divisor;
        
        // Return if nothing to divide
        if (dividend < divisor) return 0;
        
        // Sum divisor 2, 4, 8, 16, 32 .... times
        long sum = divisor;
        long divide = 1;
        while ((sum+sum) <= dividend) {
            sum += sum;
            divide += divide;
        }
        
        // Make a recursive call for (devided-sum) and add it to the result
        return negative ? -(divide + divideLong((dividend-sum), divisor)) :
            (divide + divideLong((dividend-sum), divisor));
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值