1. 程式人生 > >leetcode 29. Divide Two Integers

leetcode 29. Divide Two Integers

log 線性 復雜度 viso -- iso 左移 最大 組合

數值處理的題目,有兩點要考慮的地方:

  • 正負號的問題,對於正數除正數, 負數除正數。。。。
  • 處理越界的問題。

解決方案:加減法,最簡單的方法是用被除數一直減去除數,直到為0, 但是復雜度高。

優化方案: 使用2分法加速這個過程,不斷給除數*2,任何一個證書可以表示為以2 的冪為底的一組基的線性組合,num=a1*2^0+a2*2^1....+an*2^n;讓除數維左移直到大於被除數之前得到一個最大的基,然後每次減去這個基。 因為是2倍加大,復雜度為logn.

對於 32/3=10

32---3*10=3*(1*(2^3)+0*(2^2)+1*(2^1)+0*(2^0))

先找到a使得 x*2^(a+1),<=y< x*a^(a+1), res+=2^a, y=y-x*2^a

    int divide(int dividend, int divisor) {
            int cnt=divisor;

     long long dv=abs((long long) dividend);
     long long ds=abs((long long) divisor);
     long long remain= dv;
     long long res=0;
     while(remain>=ds)
     {
         int c=-1;
         long long v=remain;
       while(v>=ds)
       {
           v>>=1;
           c++;
       }
        remain-=ds<<c;
        res+=1<<c;
     }
     if((divisor>0)!=(dividend>0))
        res=-res;
     return res;
    }

  32/3

首先將3 向左位移,移3位不能繼續移 3*8=24 3*16>32, 32-24=8

將3 從頭向左移,移1 位不能移 3*2=6 3*4=12>8; 8-6;

leetcode 29. Divide Two Integers