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