兩數相除題解
給定兩個整數,被除數 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;
}
};