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

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

    If it is overflow, return MAX_INT.

    求两数相除,不能用乘法,除法和取余操作。

    解法:位操作Bit Operation, Time: O(logn)

    num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n

    Java:

    public int divide(int dividend, int divisor) {
        //handle special cases
        if(divisor==0) return Integer.MAX_VALUE;
        if(divisor==-1 && dividend == Integer.MIN_VALUE)
            return Integer.MAX_VALUE;
     
        //get positive values
        long pDividend = Math.abs((long)dividend);
        long pDivisor = Math.abs((long)divisor);
     
        int result = 0;
        while(pDividend>=pDivisor){
            //calculate number of left shifts
            int numShift = 0;    
            while(pDividend>=(pDivisor<<numShift)){
                numShift++;
            }
     
            //dividend minus the largest shifted divisor
            result += 1<<(numShift-1);
            pDividend -= (pDivisor<<(numShift-1));
        }
     
        if((dividend>0 && divisor>0) || (dividend<0 && divisor<0)){
            return result;
        }else{
            return -result;
        }
    }
    

      

    Python:

    class Solution:
        def divide(self, dividend, divisor):
            """
            :type dividend: int
            :type divisor: int
            :rtype: int
            """
            result, dvd, dvs = 0, abs(dividend), abs(divisor)
            while dvd >= dvs:
                inc = dvs
                i = 0
                while dvd >= inc:
                    dvd -= inc
                    result += 1 << i
                    inc <<= 1
                    i += 1
            if dividend > 0 and divisor < 0 or dividend < 0 and divisor > 0:
                return -result
            else:
                return result
    
    
    if __name__ == "__main__":
        print(Solution().divide(123, 12))
        print(Solution().divide(123, -12))
        print(Solution().divide(-123, 12))
        print(Solution().divide(-123, -12))
    

    Python:

    class Solution:
        def divide(self, dividend, divisor):
            """
            :type dividend: int
            :type divisor: int
            :rtype: int
            """
            positive = (dividend < 0) is (divisor < 0)
            dividend, divisor = abs(dividend), abs(divisor)
            res = 0
            while dividend >= divisor:
                temp, i = divisor, 1
                while dividend >= temp:
                    dividend -= temp
                    res += i
                    i <<= 1
                    temp <<= 1
            if not positive:
                res = -res
            return min(max(-2147483648, res), 2147483647)
    

    C++:

    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;
        }
    };
    

    C++:

    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;
        }
    };
    

      

      

      

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    Ext.grid.行相关
    FORM 布局
    rs.open sql,conn,1,1全接触
    arguments.callee
    Ext.window.MessageBox xtype: messagebox ; Ext.Msg Ext.MessageBox
    Ext.grid.column
    sql
    正则
    转JS
    quickFilters
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9552045.html
Copyright © 2011-2022 走看看