Divide Two Integers ——解题报告


    【题目】

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.


    【分析】

    基本思想:任何数都可以分成二进制的幂的线性表示。

    例子:以87除4举例, (4 * 2 = 8) => (8 * 2 = 16) => (16 * 2 = 32) => (32 * 2) => 64,因为64 * 2 = 128大于87,现在我们可以确定4 * 16 = 64小于87,那么再处理87 - 64 = 23,23除4的话用上面方法可以得到5,还余3,因为小于4,扔掉,所以最后结果是16 + 5 = 21。因为需要考虑溢出问题,所以先把数字转换为unsigned long long,最后转成int返回。


    【代码】

    

class Solution {
     public:
    int divide(int dividend, int divisor) {
        long long dividend2 = dividend;
        long long divisor2 = divisor;
        if (divisor2 == 0 || (dividend == 1 << 31 && divisor == -1))
            return INT_MAX;
        int negtive = (dividend2 < 0) ^ (divisor2 < 0);
        dividend2 = abs(dividend2);
        divisor2 = abs(divisor2);
        long long tmp = divisor2;
        int r = 1;
        while ((tmp << 1) <= dividend2)
        {
            tmp <<= 1;
            r <<= 1;
        }
        int res = 0;
        while (tmp >= divisor2)
        {
            if (dividend2 >= tmp)
            {
                res += r;
                dividend2 -= tmp;
            }
            tmp >>= 1;
            r >>= 1;
        }

        return (negtive) ? -res : res;
    }
};


    始终有临界值报错的代码:(后面再修改)

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(divisor == 0 || (dividend == 1 << 31 && divisor == -1))
            return INT_MAX;
        int flag;
        if(dividend * divisor < 0)
            flag = -1;
        else 
            flag = 1;
        
        unsigned long long dividend2 = abs((long long)dividend);
        unsigned long long divisor2 = abs((long long)divisor);
        
        long long res = 0;
        while(divisor2 <= dividend2)
        {
            unsigned long long tmp = divisor2, left;
            long long r = 1; 
            while(tmp <= dividend2)
            {
                tmp = tmp<<1;
                r = r<<1;
            }
            res += (r>>1);
            dividend2 -= (tmp>>1);
        }
        return res * flag;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值