[LeetCode]29. Divide Two Integers

Description

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

If it is overflow, return MAX_INT.

Discussion

不用乘除和模运算来算整数除法。

最简单而直观的方法就是用被除数一直减除数,直到为0。

另外,我们可以采用左移右移来提高效率。我们知道任何一个整数都可以表示成下面的二进制形式:

num = a0 * 20 + a1 * 21 + a2 * 22 + …… + an * 2n

我们可以把商值表示为上述形式。开始时让除数左移到恰好小于被除数的一个除数,并记下左移位数digit。每次用被除数减去除数,可以就给商answer加上2digit,然后除数右移1位,digit减1。循环执行。

算法的时间复杂度为O(logn)

C++ Code

class Solution {
public:
    int divide(int dividend, int divisor) {
        //除数为0,直接退出
        if(divisor == 0)
        {
            return INT_MAX;
        }
        bool symbol = ((dividend ^ divisor) >> 31) == 0;        //商符号
        int answer = 0;     //商
        //对除数和被除数为最小数的情况进行特殊处理
        if(dividend == INT_MIN)
        {
            if(divisor == -1)
            {
                return INT_MAX;
            }
            dividend += abs(divisor);
            answer ++;
        }
        if(divisor == INT_MIN)
        {
            return answer;
        }

        dividend = abs(dividend);
        divisor = abs(divisor);
        int digit = 0;      //商二进制位数
        while(divisor <= (dividend >> 1))
        {
            divisor <<= 1;
            digit ++;
        }
        while(digit >= 0)
        {
            if(dividend >= divisor)
            {
                answer += (1 << digit);
                dividend -= divisor;
            }
            divisor >>= 1;
            digit --;
        }

        return symbol ? answer : -answer;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值