题目

divide-two-integers


算法

* 直接模拟

* 直接模拟优化

* 递归


代码

* 直接模拟


class Solution {

public:

    int divide(int dividend, int divisor) {

        if (divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;

        long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0;

        int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;

        if (n == 1) return sign == 1 ? m : -m;

        while (m >= n) {

            long long t = n, p = 1;

            while (m >= (t << 1)) {

                t <<= 1;

                p <<= 1;

            }

            res += p;

            m -= t;

        }

        return sign == 1 ? res : -res;

    }

* 直接模拟优化


class Solution {

public:

    int divide(int dividend, int divisor) {

        long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0;

        if (m < n) return 0;    

        while (m >= n) {

            long long t = n, p = 1;

            while (m > (t << 1)) {

                t <<= 1;

                p <<= 1;

            }

            res += p;

            m -= t;

        }

        if ((dividend < 0) ^ (divisor < 0)) res = -res;

        return res > INT_MAX ? INT_MAX : res;

    }

};

* 递归


class Solution {

public:

    int divide(int dividend, int divisor) {

        long long res = 0;

        long long m = abs((long long)dividend), n = abs((long long)divisor);

        if (m < n) return 0;

        long long t = n, p = 1;

        while (m > (t << 1)) {

            t <<= 1;

            p <<= 1;

        }

        res += p + divide(m - t, n);

        if ((dividend < 0) ^ (divisor < 0)) res = -res;

        return res > INT_MAX ? INT_MAX : res;

    }

};

results matching ""

    No results matching ""