【Leetcode長征系列】 Divide Two Integers

原題:

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


思路: 記錄除數與被除數的符號判斷結果的符號。處理除數與被除數的絕對值。我的處理方式是,除數減去被除數!直到減爲負數。

代碼:

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(divisor==0) return -1;
        if(divisor == 1) return dividend;
        int res;
        bool sig = false;   //false means it is below 0; 
        
        if((dividend <0 && divisor <0) && (dividend>0 && divisor>0)) sig = true;
        if(abs(dividend) < abs(divisor)) return 0;
        else {
            for (int i=abs(dividend), res=0; i>0; i = i-abs(divisor))
                res++;
        }
        if(!sig) res = -res;
        return res;
    }
};

超時,很明顯當兩者的差別很大時,一點一點減少太浪費時間。

重想。

方法2: 用二分法。先讓divisor*2,直到它的值大於dividend,此時用dividend減去這個值,剩下的值繼續做之前那種運算,直到剩餘值小於divisor。答案便是2的冪值之和。

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(divisor==0) return -1;
        if(divisor == 1) return dividend;
        
        int res = 0;
        int count;
        bool sig = false;   //false means it is below 0; 
        long int end = abs(dividend);
        long int sor = abs(divisor);
        
        if((dividend <0 && divisor <0) && (dividend>0 && divisor>0)) sig = true;
        if(abs(dividend) < abs(divisor)) return 0;
        else {
            while(true){
                while(true){
                    count++;
                    if(pow(count,2)*sor>end) break;
                }
                res += count-1;
                end -= pow(count-1,2)*sor;
                count = 0;
                if(end < sor) break;
            }
        }
        if(!sig) res = -res;
        return res;
    }
};

依舊超時…

=================================================================================================================================

這裏有一個問題!和實驗室學長們討論後重溫到一些以前覺得無所謂的知識:

c++中,int的值爲[-2^31, 2^31-1], 所以每次當我取abs值時,會造成溢出,從而進入死循環。

所以這道題,我們需要把int改爲 long long的64位值。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章