- 题目:两个整数相除,不能用乘法、除法、模操作
- 难度:Medium
- 思路:乘除法都可以转换为加法运算,利用加法来处理除法,求最大的除数和(和不能超过被除数)这个题目还需要考虑整数边界(两个数相除可能溢出)
- 代码:
public class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 0){
return Integer.MAX_VALUE;
}
if(dividend == 0){
return 0;
}
int flag = -1;//标记两个数是否同为正数或同为负数
if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)){
flag = 1;
}
//下面是三种可能导致溢出的除式
if(dividend == Integer.MAX_VALUE && divisor == 1){
return Integer.MAX_VALUE;
}
if(dividend <= Integer.MIN_VALUE+1 && divisor == -1){
return Integer.MAX_VALUE;
}
if(dividend == Integer.MIN_VALUE && divisor == 1){
return dividend;
}
int result = (int)calculate(Math.abs((long)dividend), Math.abs((long)divisor));//这里需要先转成long型作为参数传入calculate方法,因为如果是一个越界的整数,Math.abs()是没法取其绝对值。例如int型的“-2147483648”取绝对值还是负值
return flag == 1?result:-result;
}
private long calculate(long dividend, long divisor){
if(dividend < divisor){
return 0;
}
if(dividend == divisor){
return 1;
}
long result = 1;
long sum = divisor;
while(sum + sum <= dividend){
sum += sum;
result += result;
}
return result + calculate(dividend - sum, divisor);
}
}
*需要注意的知识点:
java.lang.Math.abs(int a)返回一个int值的绝对值。如果参数为正,则返回该参数。如果参数为负,则返回否定的参数。
请注意,如果该参数为相等于Integer.MIN_VALUE,表示的最小负int值的值,其结果是相同的值,且为负。