1.我的想法
题目考查自行实现除法,理所当然想到用减法代替。
由于int类型的范围是-2的31次方到2的31次方减一,最小的数除以-1要变成最大的数。
结果的符号就由两个数同号还是异号决定。
2.结果
单纯的减法速度太慢,之后改用两倍除数与被除数比较加快运行速度,那么变量类型得是long。
(之所以是两倍而不是三倍、四倍,是因为被除数每次都要被减去一部分再和除数相比较保证被除数大于除数并且小于两倍除数。详情见代码)
由于Math.abs()这个函数,假设是int里最小的数,结果是变成0的,所以一定要先强制转换成long。
3.代码
class Solution {
public int divide(int dividend, int divisor) {
if(dividend == Integer.MIN_VALUE && divisor == -1){
return Integer.MAX_VALUE;
}
long temp = 0;
long x = Math.abs((long)dividend);
long y = Math.abs((long)divisor);
while(x >= y){
long m = y;
long n = 1;
while(m<<1 <= x){
m = m<<1;
n = n<<1;
}
x -= m;
temp += n;
}
if((dividend>=0) == (divisor>=0)){
return (int)temp;
}else{
return -(int)temp;
}
}
}