美文网首页
LeetCode #29 Divide Two Integers

LeetCode #29 Divide Two Integers

作者: 刘煌旭 | 来源:发表于2021-04-17 02:01 被阅读0次
Divide.png
/*
* F**K the corner cases...
*/
int negate(int i) { return (~(i)+1); }
int divide(int dividend, int divisor) {
    if (divisor == dividend) return 1;
    if (divisor == 1) return dividend;
    if (divisor == -1) return dividend == INT_MIN ? INT_MAX : negate(dividend);
    if (dividend == 0) return 0;
    int pow = 1, shifts = 1, nd = divisor > 0 ? divisor : (divisor != INT_MIN ? negate(divisor) : 3);
    while (shifts < 32 && pow < nd && (pow <= INT_MAX >> shifts) && (pow <<= shifts) != nd) shifts++;
    if (dividend > 0 && divisor > 0) {
        if (pow == divisor) { return dividend >> shifts; }
        int ret = 0;
        while ((dividend -= divisor) >= 0) { 
            if (ret == INT_MAX) {
                return INT_MAX;
            } else {
                ret++; 
            }
        }
        return ret;
    } else if (dividend > 0 && divisor < 0) {
        if (pow == nd) { return negate(dividend >> shifts); }
        int ret = 0;
        while ((dividend += divisor) >= 0) { 
            if (ret == INT_MIN) {
                return INT_MIN;
            } else {
                ret--; 
            }
        }
        return ret;
    } else if (dividend < 0 && divisor > 0) {
        if (pow == nd) { return dividend >> shifts; }
        int ret = 0;
        while ((dividend += divisor) <= 0) { 
            if (ret == INT_MIN) {
                return INT_MIN;
            } else {
                ret--; 
            }
        }
        return ret;
    } else {//all < 0
        if (pow == nd) { return negate(dividend) >> shifts; }
        int ret = 0;
        while ((dividend -= divisor) <= 0)  { 
            if (ret == INT_MAX) {
                return INT_MAX;
            } else {
                ret++; 
            }
        }
        return ret;
    }
}

相关文章

网友评论

      本文标题:LeetCode #29 Divide Two Integers

      本文链接:https://www.haomeiwen.com/subject/tutulltx.html