LeetCode探索之旅(100)-29Divide Two Integer

今天继续刷LeetCode,第29题,两个整数相除。

分析:
既然题目要求不能使用乘法、除法、以及求余、求模,那么可以使用两个数进行相减。通过不断的相减,判断结果与被减数之间的大小,直到结果小于被减数,统计相减的次数,就是两个整数相除的结果。

问题:
1、整数溢出的情况;
2、正负号的判断;
3、循环相减时,如果缩短计算时间问题,可以采用次方,来缩短计算时间。

附上C++代码:

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend==INT_MIN&&divisor==-1)
            return INT_MAX;
        if(dividend==INT_MIN&&divisor==1)
            return INT_MIN;
        int flag=1;
        if((long long)dividend*(long long)divisor<0)
            flag=-1;
        int re=0;
        long long m=abs((long long)dividend);
        long long n=abs((long long)divisor);
        while(m>=n)
        {
            long long p=1,t=n;
            while(m>(t<<1))
            {
                t<<=1;
                p<<=1;
            }
            re+=p;
            m-=t;
        }
        return re*flag;
    }
};

附上精简的代码:

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (dividend == INT_MIN && divisor == -1) {
            return INT_MAX;
        }
        long dvd = labs(dividend), dvs = labs(divisor), ans = 0;
        int sign = dividend > 0 ^ divisor > 0 ? -1 : 1;
        while (dvd >= dvs) {
            long temp = dvs, m = 1;
            while (temp << 1 <= dvd) {
                temp <<= 1;
                m <<= 1;
            }
            dvd -= temp;
            ans += m;
        }
        return sign * ans;
    }
};

附上Python代码:

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        if dividend==-2**31 and divisor==-1:
            return -dividend-1
        flag = -1 if (dividend <0 and divisor >0) or (dividend>0 and divisor<0) else 1
        m=abs(dividend)
        n=abs(divisor)
        re=0
        while m>=n:
            p=1
            t=n
            while m>=(t<<1):
                t<<=1
                p<<=1
            m-=t
            re+=p
        return re*flag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值