题目:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
题解(一):最暴力直接的方法是一直用被除数减除数,直到被除数小于零,输出减除数的次数,即为结果,但这样做时间复杂度太高,我们可以采用位运算进行优化,每次减去的都是2的n次方乘以除数,这样就大大减少的程序运行次数
class Solution {
public int divide(int dividend, int divisor) {
if (divisor == 0)
throw new divisorError("除数不能为零");
if (dividend == Integer.MIN_VALUE) {
if (divisor == 1)
return Integer.MIN_VALUE;
else if (divisor == -1)
return Integer.MAX_VALUE;
}
long absDividend = dividend == Integer.MIN_VALUE ?
2147483648L : Math.abs(dividend);
long absDivisor = divisor == Integer.MIN_VALUE ?
2147483648L : Math.abs(divisor);
long res = 0;
long i = 31;
int Result = 0;
/*
*利用位运算,number<<i 表示乘以2的i次方,number>>i 表示除以2的i次方
*/
while (i >= 0) {
if (res + (absDivisor << i) <= absDividend) {
res += absDivisor << i;
Result += i == 0 ? 1 : 2 << i - 1;
}
i--;
}
if (dividend >= 0 && divisor >= 0 || dividend <= 0 && divisor <= 0)
return Result;
else
return -Result;
}
private class divisorError extends RuntimeException {
public divisorError() { }
public divisorError(String s) {
super(s);
}
}
}