leetcode29——Divide Two Integers

本文介绍了一种在不使用除号的情况下实现整数除法的方法。通过利用左移运算符来实现乘2的操作,以此逼近被除数,从而有效地减少减法操作的次数并提高算法效率。

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

题目大意:在不使用*、/、%这三种符号的情况下,算出商(dividend/divisor)

分析:数学思路考察。不让用除号可以考虑加减法,当dividend大于divisor的时候,dividend就可以减去一个divisor,最后的答案就是能减去divisor的个数,但是这种循环会超时,效率太低。所以我们考虑用移位这个符号,左移一位相当于乘2,左移n位就是乘2^n,大大缩减了减法的次数。最终结果就是divisor的所有系数相加,也就是为了左移所乘的乘数相加。dividend=divisor2n1+divisor2n2+...+divisor2n

代码:转载自https://www.cnblogs.com/songlee/p/5738037.html

class Solution {
public:
    int divide(int dividend, int divisor) {
        bool positive = true;                // 表示结果的正负
        if((dividend>0 && divisor<0) || (dividend<0 && divisor>0))
            positive = false;
        long long absDividend = abs((long long)dividend);
        long long absDivisor = abs((long long)divisor);
        long long result = 0;
        while(absDivisor <= absDividend) {
            long long tmp = absDivisor;
            long long count = 1;
            while((tmp<<1) <= absDividend) {
                tmp = tmp<<1;                // divisor*2^n,divisor左移一直移到最接近dividend并且小于dividend
                count = count<<1;            // count = 2^n
            }
            result += count;                 // 系数累加
            absDividend -= tmp;
        }
        if(positive && result >= INT_MAX)
            return INT_MAX;
        return positive ? result:-result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值