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;
        }
    };
  • 相关阅读:
    Sqlite判断字段存在
    JS实现返回上一页面并刷新(转)
    WebService上传文件到服务器(转)
    ASP.NET中的DES加密解密,可用于URL传参(转)
    my97日期控件网址
    window.open用法详解(转)
    repeater绑定后alter不能弹出的解决办法(转)
    SQL Server之其他函数——类型转换函数(convert用法)(转)
    asp.net 无刷新分页时无法弹出alert对话框的解决方法 (转)
    UVa
  • 原文地址:https://www.cnblogs.com/grandyang/p/5751454.html
Copyright © 2011-2022 走看看