两数相除
解题思路:
位运算,递归。m/n就是找m中有多少个n,首先可以用暴力法,每次减一个n,但是这样耗时太久。所以可以优化一下,只要还能除,那么m一定是n的2的x次方倍,再m=m-n*2^x计算,每次递归直到m<n,把所有倍数加起来就是除法结果。
代码:
public int Divide(int dividend, int divisor)
{
int flag1 = dividend > 0 ? -1 : 1;
int flag2 = divisor > 0 ? -1 : 1;//为了防止溢出,转换成负数来计算,不过要保存下来最终结果的符号。
int flag = -1 * flag1 * flag2;
int result = search(flag1 * dividend, flag2 * divisor);//通过递归得到结果。
if (result == int.MinValue && flag == -1)//溢出的情况。只有最终结果为int.MinValue,且符号为正时溢出。
return int.MaxValue;
return result * flag;
}//主函数。
public int search(int m,int n)
{
if (m > n)
return 0;//终止条件。
int k = -1;//用来记每一步倍数。
int h = n;
while(m<h&&m-h<h)
{
k=k << 1;
h=h << 1;
}//递归中每一步要做的。
return k + search(m - h, n);//返回值。
}