leetcode 实现两个int整数相除(不用乘除,取余)

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;
}

你可能感兴趣的:(算法及程序)