1. 程式人生 > >Leetcode之Divide Two Integers

Leetcode之Divide Two Integers

題目:

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:

Input: dividend = 10, divisor = 3
Output: 3

Example 2:

Input: dividend = 7, divisor = -3
Output: -2

Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

程式碼:

class Solution {
public:
    int divide(int dividend, int divisor) {
       if(dividend == INT32_MIN && divisor == -1) 
           return INT32_MAX;
        bool sign = (dividend < 0) ^ (divisor < 0); 
        long ldividend = labs(dividend);
        long ldivisor = labs(divisor); 
        int result = 0; 
        while(ldividend >= ldivisor) {
            long k = ldivisor;
            long l = 1;
            while(ldividend >= (k << 1)) { 
                k = k << 1; 
                l = l << 1; 
            }
            result += l; 
            ldividend -= k; 
        }
        return sign ? -result : result;

    }
};

注意:

  1、不能用除法,乘法,取模運算。

  2、加法和減法會超時

  3、溢位情況需要單獨考慮

  4、商可以寫作a*2^k+b*2^(k-1)+.....+n*2^0的形式(這就是思路)