两数相除(位运算)

题目: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;
    }
};
发布了71 篇原创文章 · 获赞 1 · 访问量 2798

猜你喜欢

转载自blog.csdn.net/weixin_43918473/article/details/104324836