欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【leetcode】Divide Two Integers  

程序员文章站 2022-07-09 09:27:54
...

Question :

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


Anwser 1 :

class Solution {
public:
    int divide(int dividend, int divisor) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int ret = 0;
        
        if(dividend == 0 || divisor == 0) return 0;
        
        int sign = 1;   // 1 : positive; -1 : negative
        if(dividend < 0) sign *= -1;
        if(divisor < 0) sign *= -1;
        
        long long tmpDiv = dividend;
        long long divL = abs(tmpDiv);
        long long tmpDivisor = divisor;
        long long divisorL = abs(tmpDivisor);
        
        while(divL >= divisorL){
            int count = 1;              // first: divL > divisorL 
            long long sum = divisorL;   // long long, cal divisorL
            while(sum + sum <= divL){
                count += count;
                sum += sum;
            }
            divL -= sum;
            ret += count;
        }
        
        return sign * ret;
    }
};
注意点:

1) 原理:累加除数,判断是否大于被除数

2) 设置符号位sign,判断符号

3) 对dividend和divisor都先转化成long long类型,防止负数转化成正整数时溢出

4) 除数之和sum,必须设置成long long,防止溢出(同2)


Anwser 2 :

class Solution {
public:
    int divide(int dividend, int divisor) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        long long a = dividend;
        long long b = divisor;
        
        int sign = 1;
        if(a < 0){
            a = -a;
            sign *= -1;
        }
        
        if(b < 0){
            b = -b;
            sign *= -1;
        }
        
        int d = 0;
        while ( (b << d) <= a )
        {
            ++d;
        }
        
        --d;
        
        int res = 0;
        for (int i = d; i >= 0; --i) {
            if ( (b << i) <= a ) {
                res += (1 << i);    // high to low
                a -= (b << i);      // remaider
            }
        }

        return sign * res;
    }
};


Anwser 3:

class Solution {
 private:
     long long f[100];
 public:
     int bsearch(long long a[], int left, int right, long long key)
     {
         if (left > right)
             return -1;
             
         int mid = left + (right - left) / 2;
         if (a[mid] == key)
             return mid;
         else if (a[mid] < key)
         {
             int pos = bsearch(a, mid + 1, right, key);
             return pos == -1 ? mid : pos;
         }
         else
         {
             return bsearch(a, left, mid - 1, key);
         }
     }
     
     int divide(int dividend, int divisor) {
         // Start typing your C/C++ solution below
         // DO NOT write int main() function
         int sign = dividend < 0 ? -1 : 1;
         if (divisor < 0)
             sign *= -1;
         
         long long div = dividend;
         div = abs(div);
         long long divisorL = divisor;
         divisorL = abs(divisorL);
         f[0] = divisorL;
         int size = 1;
         while(true)
         {
             if (f[size-1] >= div)
                 break;
             f[size] = f[size-1] + f[size-1];
             size++;
         }
         
         int num = 0;
         long long sum = 0;
         while(div > 0)
         {
             int pos = bsearch(f, 0, size - 1, div);
             if (pos == -1)
                 break;
             div -= f[pos];
             num += (1 << pos);
         }
                 
         return num * sign;
     }
 };