Question29–Divide Two Integers
给定两个int型数,一个被除数,一个除数(不为零),在不使用乘法、除法、取余操作的条件下,求出商。若溢出,则返回INT_MAX。
算法
- 溢出的情况只有一种,即被除数为INT_MIN,除数为-1.
- 确定符号,两个数同号为正,异号为负,因此可以用异或操作来定符号。
- 当然最容易的就是一直用被除数减去除数,记录次数,直到被除数小于除数。但这样会超过时间限制。
- 另一种方法是,在不断减的过程中,让除数翻倍,即第一次减掉一个除数,第二次除数变为原来2倍,因此减掉两个原始除数,一直做,直到除数翻倍时大于了剩余的被除数,则从头来过,将除数置为初始的除数。
code
int divide(int dividend, int divisor) {
if(dividend==INT_MIN&&divisor==-1) return INT_MAX;
int sign=((dividend<0)^(divisor<0))?-1:1;
long long a=labs(dividend), b=labs(divisor);
int quotient=0,q=1;
long long sum;
while(a>=b){
sum=b;
q=1;
a=a-sum;
quotient+=q;
while((sum<<1)<=a){
sum=sum<<1;
q=q<<1;
a=a-sum;
quotient+=q;
}
}
return sign*quotient;
}