29. Divide Two Integers

本文介绍了一种不使用乘法、除法和取模运算来实现除法的方法。通过使用加减法和位移运算,结合整数的二进制表示特性,提出了一种有效的算法思路。特别注意了边界条件处理,并提供了详细的C++实现代码。

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

要正确地解答这道题目,需要注意三点。第一点,题目要求不能够使用乘法、除法和取模运算,所以我们只能够使用加减法和位移运算。第二点,任何一个整数num,都能表示为如下形式:num=c+a0*d*2^0+a1*d*2^1+a2*d*2^2+...+an*d*2^n,其中c在这里>=0并且<d,ai为0或者1,d为>=1的整数。第三点,要注意一些边界情况,比如dividend为INT_MIN并且divisor为-1。算法思想是,我们找出pDivisor能够左移的最大次数numShift,使得pDivisor<<numShift刚刚大于pDividend,这时numShift类似于第二点中的n+1,然后我们记录下pDivisor在这部分获取到的倍数1<<(numShift-1),并将pDividend减去pDivisor<<(numShift-1),并开始下一循环。详细代码如下:

class Solution {
public:
    int divide(int dividend, int divisor) {
        // 处理特殊情况
        if (divisor==0) {
            return INT_MAX;
        }
        if (divisor==-1 && dividend==INT_MIN) {
            return INT_MAX;
        }
        
        // 得到非负数
        long long pDividend = abs((long long)dividend); // 一定要强制类型转化,否则abs(INT_MIN)的结果会非常奇怪
        long long pDivisor = abs((long long)divisor);
        int result = 0;
        while (pDividend>=pDivisor) { // 要写等号
            // 计算左移多少次可以使pDivisor<<numShift刚刚大于pDividend
            int numShift = 0;
            while (pDividend>=(pDivisor<<numShift)) {
                numShift++;
            }
            result += 1<<(numShift-1);
            pDividend -= pDivisor<<(numShift-1);
        }
        if ((divisor>0 && dividend>0) || (divisor<0 && dividend<0)) {
            return result;
        } else {
            return -result;
        }
        
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值