我们知道:a/b 的话,可以描述为 a=q*b+r, 这里 r是一个 0<=r<b 的数
所以我们要找到最大的q来满足这个等式。
在寻找的时候我们可以每次乘二来探测,以降低线性查找的复杂度。
int div1(const int x,const int y)
{
int a=x,b=y,c=0;
int d=0;
while(a>=b)
{
d=1;
while(b*d<=a)
{
d*=2;
}
c+=d>>1;
a=a-b*(d-1);
}
return c;
}
方法二: 我们也可以通过二分查找。
对于a/b=c ,c的范围可以在【0,a]之间,因为b是要求大于等于1的。
代码如下所示:
int div2(const int x,const int y) // 二分查找
{
int i=0,j=x;
while(i<j-1)
{
int m=i+((j-i)>>1); // 不能用除法
if(m*y>x)
{
j=m-1;
}
else if(m*y<x)
{
i=m;
}
else
{
return m;
}
}
if(i+1==j)
{
if(j*y<=x)
return j;
else
return i;
}
else
{
return i;
}
}