原題:
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位值。