题目描述:
给定两个整数,被除数dividend和除数divisor,将两数相除,要求不使用除法、乘法和mod求余运算符。返回被除数除以除数得到的商。
题目解析:
本题的关键在于如何控制好商和余数的溢出。(采用移位的思想来表示乘法和除法:向左移1位,表示乘以2,向右移动一位,表示除以2)
class Solution{
public:
int divide(int dividend,int divisor){ //dividend为被除数,divisor为除数
//排除除数为0的情况
if(divisor==0) return INT_MAX;
//排除除数为1的情况
if(divisor==1) return dividend;
//排除除数和被除数相等的情况
if(dividend==divisor) return 1;
//排除除数=-1情况
if(divisor == -1)
{
if(dividend>=0)
return -dividend;
else if(dividend>INT_MIN)
return dividend;
else return INT_MAX;
}
//如果除数为最小值,则此时
if(divisor==INT_MIN) return 0;
int addCout =0;
bool flag = false;
if((dividend>0&&divisor>0)||(dividend<0&&divisor<0)) flag =true;//同号为真
if(dividend == INT_MIN) //当被除数为最小值
{
dividend+=abs(divisor);
addCout=1;
}
int dend = abs(dividend); //取被除数的绝对值
int sor = abs(divisor); //取余数的绝对值
int Cout = 0;
if(dend<sor){ Cout =0;}
else {
while(dend>=sor)
{
long tmp =sor;
int bCout = 1;
while((2*tmp)<dend) //相当于移位操作
{
tmp=2*tmp;
bCout=2*bCout;
}
dend = dend-tmp;
Cout = Cout+bCout;
}
}
if(flag==true) return Cout+addCout;
else return -(Cout+addCout);
}
};