题目:
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

题解思路:
方法:二分查找+递归
假设a=10,b=3;(a/b)
1.判断边界条件,如果a为0,返回0;如果b为1,返回a,如果b为-1,怕判断a,如果a>最小值INT-MIN,就返回-a,否则返回最大值INT_MAX。
2.第一,判断a和b的大小关系,如果a<b,返回0。如果a>b,引入一个计数器cnt初始化为1。
首先,b的值翻倍即2b为6,接着判断a和2b的大小,如果a>2b,b就翻倍为2b为6,cnt也翻倍为2cnt,到了当b=6时,2*6=12>a=10,这时候cnt处于2-4之间,因此就把a-2b即为10-6=4在和b=3去比较,再累加到计数器cnt中。
再判断2b和a的关系,如果a>2b,2b继续翻倍,
注意b翻倍为2b的同时计数也要翻倍,cnt变为2cnt
函数代码:
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend==0)
{
return 0;
}
else if(divisor==1)
{
return dividend;
}
else if(divisor==-1)
{
if(dividend>INT_MIN)
{
return -dividend;
}
return INT_MAX;
}
long a=dividend;
long b=divisor;
int flag=1;
if((a>0&&b<0)||(a<0&&b>0))
{
flag=-1;
}
a=a>0?a:-a;
b=b>0?b:-b;
long res=div(a,b);
if(flag>0)
{
return res>INT_MAX?INT_MAX:res;
}
return -res;
}
long div(long a,long b)
{
if(a<b)
{
return 0;
}
long temp_b=b;
int cnt=1;
while(temp_b*2<=a)
{
cnt=cnt*2;
temp_b=temp_b*2;
}
return cnt+div(a-temp_b,b);
}
};
848

被折叠的 条评论
为什么被折叠?



