leetcode29两数相加

题目描述:
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

解题思路:
用减法代替除法,并使除数翻倍不断逼近。
预先处理好边界情况,如除数为0,1,-1。
将计算的ab都调整为负数,且sum-a+sum语句不可换位,否则若写成sum+sum-a会越界。

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(divisor==0){  //除数为0
            return 0;
        }
        if(divisor==1){  //除数为1
            return dividend;
        }
        int flag=0,res=0;
        if(divisor==-1){  //除数为-1,越界
            if(dividend>INT_MIN){
                return -dividend;
            }
            return INT_MAX;
        }
        if((dividend>0&&divisor>0)||(dividend<0&&divisor<0)){  //判断正负
            flag=1;
        }
        dividend=dividend>0?0-dividend:dividend;  
        divisor=divisor>0?0-divisor:divisor;
        res=div(dividend,divisor);
        return flag>0?res:0-res;     
    }

    int div(int a,int b){  //除法实现
        if(a>b){
            return 0;
        }
        int count=1,sum=b;
        while(sum-a+sum>=0){  //若除数的2倍仍小于被除数
            count+=count;
            sum+=sum;
        }
        return count+div(a-sum,b);  //减去该数量级后继续递归逼近
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值