LeetCode Java First 400 题解-029

本文介绍了一种在不使用乘法、除法和取模运算的情况下实现两个整数相除的方法。通过模拟除法过程,每次将被除数加倍,相应的商也加倍,以此来找到最大的被除数倍数不超过除数的情况,从而计算出商。这种方法的时间复杂度为O((lgn)^2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Divide Two Integers    Medium

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

If it is overflow, return MAX_INT.

public int divide(int dividend, int divisor) {

    if (divisor == 0)

        throw new java.lang.ArithmeticException("/ by zero");

    long result = divideLong(dividend, divisor);

    return result > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) result;

}



public long divideLong(long dividend, long divisor) {

    boolean negative = 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 negative ? -(divide + divideLong((dividend - sum), divisor))

            : (divide + divideLong((dividend - sum), divisor));

}

思路:模拟除法,每次被除数(dividend)加倍,则除的结果加倍(从1开始,2、4、8……)。O((lgn)^2)

除数/被除数=结果,根据等式原理,两边同时乘以相同数仍然相等。例:

55/5 = 11

每次加倍,所以5->10->20->40 (对应结果1->2->4->8),注意1*5=5, 2*5=10, 4*5=20, 8*5=40

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值