LeetCode 29 - Divide Two Integers

一、问题描述

Description:

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

If it is overflow, return MAX_INT.

不使用乘法、除法与取余操作符(即*/%),实现两个整数相除,返回商。

如果溢出,返回 INT_MAX。


二、解题报告

不使用*/%实现两个整数相除,首先想到的一个思路:

将除数不停地一个一个累加,并记录累加次数,直到大于被除数为止。

但是这种方法超时了。

一个一个累加太慢了,那么我们可以换种思路:

使用 移位 操作——左移一位相当于乘以2,而被除数是可以表示成除数的一个线性组合的形式:

dividend=divisor2n1+divisor2n2+...+divisor2nx

其中 0n1n2...nx,故我们所要求的结果就是:
result=2n1+2n2+...+2nx

代码如下:

class Solution {
public:
    int divide(int dividend, int divisor) {
        bool positive = true;                // 表示结果的正负
        if((dividend>0 && divisor<0) || (dividend<0 && divisor>0))
            positive = false;

        int64_t absDividend = abs((int64_t)dividend);
        int64_t absDivisor = abs((int64_t)divisor);
        int64_t result = 0;

        while(absDivisor <= absDividend) {
            int64_t tmp = absDivisor;
            int64_t count = 1;
            while((tmp<<1) <= absDividend) {
                tmp = tmp<<1;                // divisor*2^n
                count = count<<1;            // count = 2^n
            }
            result += count;                 // 系数累加
            absDividend -= tmp;
        }

        if(positive && result >= INT_MAX)
            return INT_MAX;

        return positive ? result:-result;
    }
};

int的范围是 [-2147483648,2147483647],所以存在的溢出情况是:-2147483648除以-1,此时应该输出INT_MAX

AC 时间 4ms!





LeetCode答案源代码:https://github.com/SongLee24/LeetCode


转载于:https://www.cnblogs.com/songlee/p/5738037.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值