leetcode 29. Divide Two Integers

题意

在不使用乘、除、模运算的情况在进行除法运算

题解

  • 每次将被除数拆分出能被除数除的最大值(是2^k形式)。
  • 对应的位运算操作: 将除数左移k次直至是小于等于被除数的最大值(dividend >= divisor * 2^k)。此时这部分的商为2^k
  • 例如:15/4 = 8/4 + 7/4 = 2 + 1 = 3; (4二进制为0100)
    1) 第一次移动k=1位时8=1000 < 15 < 16=10000 ,商为2^1=2,被除数剩余15-8=7
    2) 第二次移动k=0位时4=0100 < 7 < 8=1000 ,商为2 + 2^0 = 3,被除数剩余7-4=3
    3) 3 < 4, 结束

代码

class Solution {
public:
    int divide(int dividend, int divisor) {
        const int MAXINT = ~(1 << 31);
        bool isNeg = false;
        if((dividend >> 31 ^ divisor >> 31) != 0)
            isNeg = true;
        long long newdivid = (long long)dividend;
        long long newdivis = (long long)divisor; // avoid overflow when a num left-shift to 31th. (postive num -> negtive num)
        newdivid = abs(newdivid);
        newdivis = abs(newdivis);
        int shift;
        int result = 0;
        while(newdivid >= newdivis)
        {
            shift = 0;
            long long temp = newdivis;

            while(newdivid >= (temp << 1))
            {
                temp <<= 1;
                shift++;
            }

            newdivid -= temp; 
            result += (1<<shift);

        }
         if(result == (1 << 31) && divisor == -1) // overflow, int hasn't +2147483648
             return MAXINT;
        return isNeg ? -result : result;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值