leetcode

Question29–Divide Two Integers

给定两个int型数,一个被除数,一个除数(不为零),在不使用乘法、除法、取余操作的条件下,求出商。若溢出,则返回INT_MAX。

算法

  1. 溢出的情况只有一种,即被除数为INT_MIN,除数为-1.
  2. 确定符号,两个数同号为正,异号为负,因此可以用异或操作来定符号。
  3. 当然最容易的就是一直用被除数减去除数,记录次数,直到被除数小于除数。但这样会超过时间限制。
  4. 另一种方法是,在不断减的过程中,让除数翻倍,即第一次减掉一个除数,第二次除数变为原来2倍,因此减掉两个原始除数,一直做,直到除数翻倍时大于了剩余的被除数,则从头来过,将除数置为初始的除数。

code

int divide(int dividend, int divisor) {
    if(dividend==INT_MIN&&divisor==-1) return INT_MAX;

    int sign=((dividend<0)^(divisor<0))?-1:1;

    long long a=labs(dividend), b=labs(divisor);

    int quotient=0,q=1;


    long long sum;
    while(a>=b){
        sum=b;
        q=1;
        a=a-sum;
        quotient+=q;
        while((sum<<1)<=a){
            sum=sum<<1;
            q=q<<1;
            a=a-sum;
            quotient+=q;
        }
    }

    return sign*quotient;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值