【leetcode】29-两数相除【C++】

本文深入探讨了一种高效的除法算法实现方式,避免了传统暴力求解可能导致的时间复杂度过高问题。通过循环倍增除数并记录每次增大的倍数,最终通过累加这些倍数得到结果,大幅提升了运算效率。

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

题目如下:

解题思路:

本题的根本在于 被除数 可以减去多少次 除数 。如果直接暴力求解,那么当被除数为 2147483648 除数为 1 必然超时。

切换问题思路,循环倍增 除数 直到再倍增时无法被 被除数 整除即停止,记录除数增大的 倍数 。然后将被除数减去目前的除数,并将除数恢复为初始值后进入下一次循环。最后结果就等于所有的记录的倍数相加。可参考下列公式来理解:

  • // dividend = ... + 0*divisor*2^2 + 1*divisor*2^1 + 1*divisor*2^0
  • // ans = ... + 0*2^2 + 1*2^1 + 1*2^0

代码如下:

class Solution {
public:
    int divide(int dividend, int divisor) {
        long res = 0;
        long a = labs(dividend), b = labs(divisor);
        while(a >= b){
            long times = 1, temp = b; //times为被除数增大的倍数,temp为除数的中间变量
            while(a >= (temp << 1)){
                times <<= 1; //左移一位表示增大一倍
                temp <<= 1;
            }
            res += times;
            a -= temp;
        }
        res = ((dividend > 0) ^ (divisor > 0)) ? -res : res; //异或操作判断符号
        return (res > INT_MAX || res < INT_MIN) ? INT_MAX : res;
    }
};

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值