Leetcode: Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

需要很多边界检查,要注意时间复杂度。

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (divisor == 0) {
            if (dividend < 0) {
                return numeric_limits<int>::min();
            }
            else {
                return numeric_limits<int>::max();
            }
        }
        if (dividend == divisor) return 1;
        if (divisor == numeric_limits<int>::min()) return 0;
        int extra = 0;
        if (dividend == numeric_limits<int>::min()) {
            if (divisor > 0) {
                dividend += divisor;
            }
            else {
                dividend -= divisor;
            }
            extra = 1;
        }
        
        bool positive = ((dividend & (1 << 31)) == (divisor & (1 << 31)));
        dividend = abs(dividend);
        divisor = abs(divisor);
        
        int result = 0;
        int count = 1;
        int factor = divisor;
        int threshold = numeric_limits<int>::max() >> 2; 
        while (dividend >= factor) {
            result += count;
            dividend -= factor;
            if (factor <= threshold) {
                factor += factor;
                count += count;
            }
        }
        if (dividend >= divisor) {
            factor >>= 1;
            count >>= 1;
            while (count >= 1) {
                while (dividend >= factor) {
                    result += count;
                    dividend -= factor;
                }
                if (dividend == 0) {
                    break;
                }
                factor >>= 1;
                count >>= 1;
            }
        }
        
        result += extra;
        return (positive ? result : -result);
    }
};


你可能感兴趣的:(LeetCode)