Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
译文:两个整数相除,不要用乘法、除法、以及模运算。如果溢出,则返回MAX_INT。
看到这道题没有想法,试了网上好多代码,leetcode都运行不通过,最终找到了一个,特此总结。主要的思想不是很好描述,先大概描述一下,可以参看源码理解。思想:主要就是看能否从被除数中剥离除数的shiftTime倍。至于为什么程序中的被除数和除数需要转换成long类型尼?举个例子,如果被除数是,在进行绝对值后就变成了
,这样如果不是long的话,就会发生溢出。所以我们需要把被除数、除数等设置为long以便在处理数据时不发生溢出。附上代码:
public int divide(int dividend, int divisor)
{
if(dividend == Integer.MIN_VALUE && divisor == -1)
return Integer.MAX_VALUE;
long result = 0;
int flag = ((dividend > 0) ^ (divisor > 0)) ? 1 : -1;
long dvd = dividend;
long dvs = divisor;
dvd = Math.abs(dvd);
dvs = Math.abs(dvs);
while(dvd >= dvs)
{
long temp = dvs;
int shiftTime = 0;
while(dvd >= temp << 1)
{
temp = temp << 1;
shiftTime ++;
}
result += Math.pow(2, shiftTime);
dvd -= temp;
}
return (int) ((flag == 1) ? (-1) * result : result);
}