leetcode Divide Two Integers

本文介绍一种不使用除法指令实现两整数相除的方法。通过不断将除数放大,采用位运算来逐步逼近商的结果。文章还讨论了边界情况的处理,并给出了一段C++代码实现。

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

题目:https://oj.leetcode.com/problems/divide-two-integers/

题意:用减法和位运算代替除法

思路:这题太恶心了,最难的是边界问题,所以真正意义来讲我自己还没做出来,只是最后加了一堆if条件专门限制了一下边界时的情况

1.如果只用减法一点点用被除数减去除数那肯定超时,所以用到了一个将除数一倍一倍放大的思路,也就是2分法,举例来说,如果被除数是23,除数是4,那么2*4小于23,就将除数提高一倍,2*8也小于23,再翻倍发现2*16大于23了,那么这次翻倍就不算,前面将除数翻倍成8了对吧?也就是除数在位运算上,左移了2位,1->10->100,也就是十进制里的4,这么看来除数4,乘以刚才的位运算4,正好是16,是小于23,并且再翻倍会大于23

2.那么剩下的是23-16=7,再去递归的进行刚才的运算,将刚才的位移结果4加上这次位移结果——应该是1,也就是说一次位移都没有,那么4+1=5就为最后结果

3其实每次的移位操作,就是平时用的乘以2或除以2,只不过移位效率高,这道题的思路就是相当于把用被除数一点点减去除数,变成逐步增大地去减除数,这样效率会提升,并且细细想一下就是一位移就将除数*2,一递归就相当于除数加了一个新的部分

代码:

class Solution {
public:
    long long divided(unsigned long long dividend,unsigned long long divisor){<span style="white-space:pre">		</span>//递归调用
        if(divisor > dividend)
            return 0;
        long long re = 1;
        unsigned long long measure = divisor,left;
        while(measure <=dividend){
            left=dividend - measure;
            measure<<=1;
            if(dividend <measure) break;
            else re<<=1;
        }
        return re + divided(left,divisor);

    }
    int divide(int dividend, int divisor) {
        unsigned long long _dividend = abs((long long)dividend);
        unsigned long long _divisor = abs((long long)divisor);
        if(_divisor > _dividend) return 0;
        bool isNeg =true;
        if(dividend >= 0 && divisor > 0 || dividend <= 0 && divisor < 0)
            isNeg = false;
        long long  result ;
        if(divided(_dividend,_divisor)>INT_MAX && isNeg == false) return INT_MAX;<span style="white-space:pre">	</span>//这里注意边界条件,很麻烦
        if(isNeg) return (-1)*divided(_dividend,_divisor);;
        return divided(_dividend,_divisor);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值