Divide two integers without using multiplication, division and mod operator.
If it is overflow, return INT_MAX.
乘法实际上也是加法的重复操作,而除法则是乘法的逆操作。因此,在不用乘法,除法和模运算的情况下,我们用加法来代替除法操作。
class Solution {
public:
int divide(int dividend, int divisor) {
long long c=dividend, d=divisor, a=abs(c), b=abs(d);
if(c==0 || d==0) //处理被除数和除数为零的情况
return 0;
int flag=0; //结果正负标志
if((c>0 && d<0) || (c<0 && d>0)) //结果为负
flag=1;
if(divisor==1) //当除数为1或-1时才会出现越界情况。这个要单独处理
return dividend;
if(divisor==-1 && a>=INT_MAX){
cout<<"here"<<endl;
return dividend-1; //这里不能直接取反。涉及到补码。采取减一操作即可
}
else if(divisor==-1 && a<INT_MAX) {
return -dividend;
}
if(b>a) //除数更大,直接返回0
return 0;
long long sum=0;
int count=0,final=0;
while(a>=b){
count=1;
sum=b;
while(sum+sum<=a){ //幂指数迭代,加快计算
sum+=sum;
count+=count;
}
a-=sum;
final+=count;
}
if(flag)
final=0-final;
return final;
}
};