1. dividend=divisor*(a0*2^0+a1*2^1+...+an*2^n) 时间复杂度为logN
int divide(int dividend, int divisor)
{
if(dividend == 0 || divisor ==0)
return 0;
if((dividend == INT_MIN) && (divisor == -1)) //溢出等于INT_MAX
return INT_MAX;
bool isNeg = (dividend < 0) ^ (divisor < 0);
long long dividend1 = abs((long long)dividend);
long long divisor1 = abs((long long)divisor);
long long result = 0;
while(dividend1 >= divisor1)
{
long long temp = divisor1;
long long num = 0;
while(temp <= dividend1)
{
temp <<= 1;
num++;
}
temp >>= 1;
num--;
dividend1 = dividend1 - temp;
result += 1 << num;
}
return isNeg? -result:result;
}
2.二分法,时间复杂度logN
long long multiply(long long a, long long b) //用位运算模拟乘法, a个b相乘
{
long long result = 0;
while(a)
{
if(a & 1)
result += b;
b <<= 1;
a >>= 1;
}
return result;
}
long long binarysearch(long long dividend, long long divisor,long long start, long long end)
{
if(start > end)
return start - 1;
long long mid = (start+end)>>1;
long long num = mid;
long long temp = multiply(mid,divisor);
if( temp == dividend)
return mid;
else if(temp < dividend)
return binarysearch(dividend,divisor,mid+1,end);
else
return binarysearch(dividend,divisor,start,mid-1);
}
int divide1(int dividend, int divisor)
{
if(dividend == 0 || divisor ==0)
return 0;
if((dividend == INT_MIN) && (divisor == -1)) //溢出等于INT_MAX
return INT_MAX;
bool isNeg = (dividend < 0) ^ (divisor < 0);
long long dividend1 = abs((long long)dividend);
long long divisor1 = abs((long long)divisor);
long long num = binarysearch(dividend1,divisor1,1,dividend1);
return isNeg? -num:num;
}