两个整数相除
题目
将两个整数相除,要求不使用乘法、除法和 mod 运算符。
如果溢出,返回 2147483647 。样例
给定被除数 = 100 ,除数 = 9,返回 11。
题解
不能用乘除法则用减法和位操作代替,注意处理溢出问题,用倍增减法优化时间复杂度。
while(d1 >= temp)
{
d1-=temp;
ret+=cnt;
cnt = cnt<<1;
temp = temp<<1;
}
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
boolean resultGreatThanZero = (long)dividend * divisor > 0;
long ret = 0;
long d1 = Math.abs((long)dividend);
long d2 = Math.abs((long)divisor);
while(d1 >= d2)
{
long temp = d2;
long cnt = 1;
while(d1 >= temp)
{
d1-=temp;
ret+=cnt;
cnt = cnt<<1;
temp = temp<<1;
}
}
ret = resultGreatThanZero ? ret : ~ret + 1;
return (ret < Integer.MIN_VALUE || ret > Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int)ret;
}
}
Last Update 2016.11.17