Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题意:实现一个除法,不能用division,mod,multiplication这三种运算。当然了能用division,写个毛线啊。这些都不能用,运算里面只有加法了,其实计算机所有的运算都是靠加法实现的,为什么?CPU只有加法器嘛。
解析:首先考虑特殊情况,int类型的上下限问题,除零问题,以及除数是1或-1的问题,这些都有可能导致overflow。
其次,考虑到只能用加法,那每次加多少呢?如果一次加一倍的divisor,算法效率太慢,需要加速,每次加2的n次幂倍的divisor,实现很简单,sum= divisor,每次循环sum+=sum就可以实现,再用另一个计数器 count=1,每次循环同样的 count+=count;
考虑到加法的过程中会出现overflow的情况,因此中间变量最好使用long类型,并将所有的负数转化成正数运算,还有结果的正负号问题也要在开始的时候判断出来。
代码实现:
public class Solution
{
public int Divide(int dividend, int divisor)
{
if (divisor == 0)
return 2147483647;
else if (dividend == -2147483648 && divisor == -1)//特殊情况,结果会溢出。
return 2147483647;
else if (divisor == 1 || divisor == -1)//可以不单独拿出来,但是可以直接知道结果,为啥要算呢。
return divisor == 1 ? dividend : -dividend;
int flag = (dividend ^ divisor) >> 31;//记录结果的符号
long _dividend = (long)(dividend);
long _divisor = (long)(divisor);
_dividend = Math.Abs(_dividend);
_divisor = Math.Abs(_divisor);//将数据转化成正数long类型
long sum = _divisor;
long remainder = _dividend;//循环结束标志,当小于divisor时循环结束
long ret = 0;
while (remainder >= _divisor)
{
long count = 1;//计数器
while ((sum + sum) <= remainder)
{
sum = sum << 1;
count = count << 1;
}
ret += count;
remainder -= sum;
sum = _divisor;
}
return flag == 0 ? (int)ret : (int)-ret;
}
}