两数相除(位运算)

题目:https://leetcode-cn.com/problems/divide-two-integers/

class Solution {
public:
    int divide(int dividend, int divisor) {
        /*
        *两数相除求商,要求不用 乘法、除法、mod
        *思路:用左移运算符逐“位”确定商
        *注意防int溢出
        */
        int flag = 1;
        //先转成long long计算
        long long y = dividend;
        long long x = divisor;
        if(x < 0) {
            x = -x;
            y = -y;
        }
        if(y < 0) {
            y = -y;
            flag = -1;
        }
        if(x == 1) {//特判
            y *= flag;
            if(y > INT_MAX) return INT_MAX;
            if(y < INT_MIN) return INT_MIN;
            return y;
        }
        if(y < x) return 0;//特判
        long long a = 0, b = 1, c = x;
        while(1){
            while( (x<<1) < y) x <<= 1,b <<= 1;
            y -= x;
            a += b;
            if(y < c) break;
            x = c;
            b = 1;
        }
        a = a*flag;
        if(a > INT_MAX) return INT_MAX;
        if(a < INT_MIN) return INT_MIN;
        return a;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值