题目链接:https://leetcode-cn.com/problems/divide-two-integers/
思路:先判断最后的结构是负的还是正的,然后全部转换成正数做,最后加上符号即可。因为不能用除法、乘法和mod,所以我们考虑用减法,但是不能直接减,比如1e9 2,减的话每次减2肯定会超时(因为要减1e9/2次),所以我想的是递增减,就是说1e9 2,第一次减2(result+=1),第二次我减4(result+=2),第三次我减8(result+=4),当减数大于被减数的时候,假设最后剩下10 11(这样并没有结束,因为10还可以减2),这样就再从10 2开始减就好了(注意result每次加的数就可以啦)。所以当不能减的时候我们就递归到下一层去算重新从2开始减的值,这样每次当不能减的时候就递归一层,最后答案相加即可。递归出口就是被减数小于开始的时候的减数(例子里面是2),return 0即可。
注意:-2^31转成正数的时候要注意,这个数不能直接转成正数。还有就是很多边界问题需要考虑,这里不说了,代码里都有(边界问题很多坑,好好想想哦~~~)。
上代码:
class Solution {
public int divide(int dividend, int divisor) {
int flag = dividend > 0 && divisor < 0 || dividend < 0 && divisor > 0 ? -1 : 1;
int x = 0;
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
} else if (dividend == Integer.MIN_VALUE && divisor == Integer.MIN_VALUE) {
return 1;
} else if (divisor == Integer.MIN_VALUE) {
return 0;
} else if (dividend == Integer.MIN_VALUE) {
x = 1;
dividend += Math.abs(divisor);
}
return flag == 1 ? x + newDivide(Math.abs(dividend), Math.abs(divisor)) : -x - newDivide(Math.abs(dividend), Math.abs(divisor));
}
public int newDivide(int dividend, int divisor) {
if (Math.abs(dividend) < Math.abs(divisor)) {
return 0;
}
int mul = 1;
int result = 0;
int tmp = divisor;
while (dividend >= divisor) {
dividend -= divisor;
result += mul;
if (Integer.MAX_VALUE - divisor < divisor) {
break;
}
mul += mul;
divisor += divisor;
}
return result + newDivide(dividend, tmp);
}
}