Leetcode29.Divide_Two_Integers

通过右移’>>’操作使除数乘2,在logN的时间内得到2^p

class Solution {      //不断右移扩大除数,在O(logN)完成除法(注意边界INT_MAX/INT_MIN,右移越界导致死循环,用long long防止越界)
public:
    int divide(int dividend, int divisor) {
        if (dividend == INT_MIN && divisor == -1)
            return INT_MAX;
        long long abs_dividend = abs((long long)dividend), abs_divisor = abs((long long)divisor), result = 0;
        int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
        if (abs_divisor == 1)
            return sign == 1 ? abs_dividend : -abs_dividend;
        if (abs_dividend < abs_divisor)
            return 0;
        long long total = abs_divisor, time = 1;
        while (abs_dividend - total >= total)
        {
            time <<= 1;
            total <<= 1;
        }
        result += time;
        abs_dividend -= total;
        while (time && abs_dividend >= abs_divisor)
        {
            if (abs_dividend - total > 0)
            {
                abs_dividend -= total;
                result += time;
            }
            total >>= 1;
            time >>= 1;
        }
        return sign > 0 ? result : -result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值