两数相除题解
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
题解:这道题说实话没啥意思,主要是边界值的处理
除数为INT_MIN,被除数为-1时,单纯int会发生数值位溢出,所以利用unsigned int 存储除数和被除数可解。
在实现除法方面,采用指数逼近的方式,依次做减法,可解。注意:在找小于除数最大的指数时,用unsigned int 也会发生数值位溢出。所以采用 long long (long 同int 也是4字节)。
代码:
class Solution {
public:
int divide(int dividend, int divisor) {
unsigned int x;
unsigned int y;
int f=1;
if(dividend>INT_MIN&÷nd<0)
{
f=-f;x=-dividend;
cout<<x;
}
else if(dividend==INT_MIN)
{
f=-f;x=dividend;
}
else
{
x=dividend;
}
if(divisor>INT_MIN&&divisor<0)
{
f=-f;y=-divisor;
}
else if(divisor==INT_MIN)
{
f=-f;y=divisor;
}
else
{
y=divisor;
}
long long base=1;
long long sg=y;
while(sg<=x)
{
sg=sg<<1;
base=base<<1;
}
//cout<<1;
sg=sg>>1;
base=base>>1;
long long res=0;
while(x>=y)
{
//cout<<res<<"?"<<sg<<endl;
x-=sg;
res+=base;
//cout<<res<<endl;
while(sg>x)
{
sg=sg>>1;
base=base>>1;
}
}
res=f==-1?-res:res;
if(res>INT_MAX)
return INT_MAX;
return res;
}
};