zoukankan      html  css  js  c++  java
  • [LintCode] Divide Two Integers 两数相除

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

    If it is overflow, return 2147483647

     
    Example

    Given dividend = 100 and divisor = 9, return 11.

    LeetCode上的原题,请参见我之前的博客Divide Two Integers

    解法一:

    class Solution {
    public:
        /**
         * @param dividend the dividend
         * @param divisor the divisor
         * @return the result
         */
        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:
        /**
         * @param dividend the dividend
         * @param divisor the divisor
         * @return the result
         */
        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:
        /**
         * @param dividend the dividend
         * @param divisor the divisor
         * @return the result
         */
        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;
            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;
        }
    };
  • 相关阅读:
    codevs2034 01串2
    codevs2622数字序列( 连续子序列最大和O(n)算法)
    codevs3008加工生产调度(Johnson算法)
    codevs1955光纤通信(并查集)
    codevs4203山区建小学
    codevs2618核电站问题
    常用端口
    ntp时间同步服务器
    date linux系统校正时间
    用户切换
  • 原文地址:https://www.cnblogs.com/grandyang/p/5751454.html
Copyright © 2011-2022 走看看