LeetCode-Divide Two Integers-快速除法

本文介绍了一种在不使用乘除法的情况下实现除法运算的方法。利用移位运算减少减法操作,通过被除数右移计算出除数需要左移的最大位数,从而高效完成除法计算。

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

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

不使用乘除实现除法。

那么能够使用的就是+-和移位运算。首先检查边界和符号。如果用一直减的方法实现,会有可能除数很小导致超时。

所以必须借助移位运算减少减法操作数目。

我的想法是,首先通过被除数右移计算出一个除数需要左移的最大位数。然后从最大的右移位数一直减小到右移0,每次都将a减少到无法减少,并将结果+=2^k即可。

class Solution {
public:
    int divide(int dividend, int divisor) {
        long long int a=dividend;
        long long int b=divisor;
        int flag=1;
        if (a==0){return 0;}
        if (b==0){return 0;}
        if (a<0){flag=!flag;a=-a;}
        if (b<0){flag=!flag;b=-b;}
        if (a<b){return 0;}
        long long int d=a;
        int k=0;
        while (d>b){
            d=d>>1;
            k++;
        }
        k=max(0,k-1);
        int c=0;
        for (int i=k;i>=0;i--){
            d=b<<i;
            while(a>=d){
                a-=d;
                c+=1<<i;
            }
        }
        if (!flag){c=-c;}
        return c;
    }
};

  

转载于:https://www.cnblogs.com/yangsc/p/4005144.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值