【leetcode】Divide Two Integers

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.