leecode第二十九题(两数相除)

博主分析数学题时,起初想对被除数一半一半展开,但奇偶情况复杂,后采用新方法又难以掌控取值范围,最终用了long类型,觉得解题过程麻烦。

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

 

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend==0x80000000&&divisor==-1)//溢出情况
            return 0x7FFFFFFF;
        
        long cur_dividend=dividend;//用long吧,不然太难搞了
        long cur_divisor=divisor;
        bool flag=false;//记录符号
        if(dividend<0)
        {
            cur_dividend=~cur_dividend+1;//取反加一,将补码弄成原码
            flag=!flag;
        }
        if(divisor<0)
        {
            cur_divisor=~cur_divisor+1;
            flag=!flag;
        } 

        long res=0;
        long temp=cur_divisor;
        while(cur_dividend-temp>=0)//就不停检查当前最多容纳的cur_divisor
        {
            int cur_res=1;
            while((temp<<1)<cur_dividend)//不停*2,对速度特别友好
            {
                temp=temp<<1;
                cur_res=cur_res<<1;
            }
            cur_dividend=cur_dividend-temp;//,如果容纳不了,减去已经容纳的,然后继续检测
            temp=cur_divisor;
            res+=cur_res;
        }
        
        if(flag)
            res=~res+1;
        return res;
    }
};

 分析:

真的是,够够的,一开始想对被除数一半一半展开,但是对于奇偶情况特别复杂,于是想到这个,但是这个我又对取值范围难以掌控,最后用了long类型,唉,好麻烦啊这个题。

转载于:https://www.cnblogs.com/CJT-blog/p/10802010.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值