1.两数相除
给定两个整数,被除数dividend和除数divisor。将两数相除,要求不使用乘法、除法和mod运算符。
返回被除数dividend除以除数divisor得到的商。
思路:
- 加减计数:被除数一直减除数,直到剩余的差小于除数 — 超时
- 移位
- 设divid,divis分别为dividend,divisor的绝对值。以divid = 73(二进制0100 1001),divis = 5(二进制0101)为例。设一个计数器cnt,每次cnt求得的结果为:设divis可以左移的最大位数为n,则cnt = 2n,刚好满足divis > divid
- 初始divid = 0100 1001,divis = 0101,显然当divis左移4位时,temp = 0101 0000刚好大于divid。此时temp = divis × 24。由于temp刚好大于divid,所以divis × 23一定小于divid。所以divid里面至少有23个divis,所以res累加8。
- 更新divid = divid - (temp >> 1),即temp = temp - divis × 23,再次循环直到divis > divid。
long long abs(int n)
{
long long res = n;
if(res < 0)
{
res = -res;
}
return res;
}
int divide(int dividend, int divisor) {
long long res = 0;
int int_min = 1<<31;
int int_max = (int_min>>31) ^ int_min;
long long divid = dividend;
long long divis = divisor;
bool resNeg = false;
if((divid > 0 && divis < 0) || (divid < 0 && divis > 0))
{
resNeg = true;
}
divid = abs(divid);
divis = abs(divis);
if(divis == 1 && (divid - 1) == int_max && !resNeg)
{
res = int_max;
return int_max;
}
long long cnt = 0;
while(divis <= divid)
{
cnt = 1;
long long temp = divis;
while(temp <= divid)
{
temp = temp<<1;
cnt = cnt<<1;
}
res += (cnt>>1);
divid -= (temp>>1);
}
if(resNeg)
{
return -res;
}
return res;
}