递归方法:
int divide(int dividend, int divisor) {
bool isNeg = false;
long long dvs = divisor,dvd = dividend;
if (dividend < 0)
{
isNeg = !isNeg;
dvd = -dvd;
}
if (divisor < 0)
{
isNeg = !isNeg;
dvs = -dvs;
}
if(isNeg)
return -divideCore(dvd, dvs, dvs, 1);
else
return divideCore(dvd, dvs, dvs, 1);
}
int divideCore(long long dvd, long long dvs, long long cur, long long mul)
{
if (dvd - dvs < 0)
return 0;
if (cur + cur < dvd)
return divideCore (dvd, dvs, cur + cur, mul + mul);
else
return mul + divideCore (dvd - cur, dvs, dvs, 1);
}
循环方法,利用divisor * x <= dividend, 从最高位31位开始猜x的值
int divide(int dividend, int divisor) {
bool isNeg = false;
long long dvs = divisor,dvd = dividend;
if (dividend < 0)
{
isNeg = !isNeg;
dvd = -dvd;
}
if (divisor < 0)
{
isNeg = !isNeg;
dvs = -dvs;
}
if (dvd < dvs) return 0;
if(isNeg)
return -divideCore(dvd, dvs);
else
return divideCore(dvd, dvs);
}
int divideCore(long long dvd, long long dvs)
{
long long res = 0;
int k = 31;
long long curDivid = dvd;
while (k>=0)
{
if (dvs <= curDivid >> k)
{
curDivid -= dvs << k;
res += 1 << k;
}
k--;
}
return res;
}
对于符号的检测,有更加优雅的方法:
int divide(int dividend, int divisor) {
int count = 0;
if (divisor == 0)
return 0;
unsigned int d1 = (dividend < 0 ? -dividend : dividend);
unsigned int d2 = (divisor < 0 ? -divisor : divisor);
for (int i = 31; i >= 0; i--)
{
if ((d1 >> i) >= d2)//(dividend >= (divisor << i)) 溢出
{
d1 -= (d2 << i);
count += (1 << i);
}
}
if ((dividend >> 31) ^ (divisor >> 31))
count = -count;
return count;
}