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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值