一、题目概述
二、思路方向
在Java中,如果不使用乘法、除法和取余运算来实现整数除法,我们可以采用位运算(特别是左移和右移操作,它们分别相当于乘以2的幂和除以2的幂)以及加减运算来实现。这种方法的关键在于利用二分查找的思想来逼近真实的商值。
三、代码实现
public class Solution {
public int divide(int dividend, int divisor) {
// 处理特殊情况
if (divisor == 0) {
throw new IllegalArgumentException("Divisor cannot be zero.");
}
if (dividend == Integer.MIN_VALUE && divisor == -1) {
// Integer.MIN_VALUE 除以 -1 会溢出
return Integer.MAX_VALUE;
}
// 确保被除数和除数都是正数或都是负数,简化处理
boolean isNegative = (dividend < 0) ^ (divisor < 0);
long absDividend = Math.abs((long) dividend);
long absDivisor = Math.abs((long) divisor);
int result = 0;
// 使用位运算模拟除法
for (int i = 31; i >= 0; i--) {
// 尝试将absDivisor左移i位(相当于乘以2^i),检查是否仍然小于等于absDividend
if ((absDivisor << i) <= absDividend) {
absDividend -= (absDivisor << i); // 减去该部分
result += 1 << i; // 对应的商加上2^i
}
}
// 根据原始符号返回结果
return isNegative ? -result : result;
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.divide(10, 3)); // 输出 3
System.out.println(solution.divide(7, -3)); // 输出 -2
System.out.println(solution.divide(0, 1)); // 输出 0
System.out.println(solution.divide(1, 1)); // 输出 1
System.out.println(solution.divide(Integer.MIN_VALUE, -1)); // 输出 Integer.MAX_VALUE
}
}
执行结果:
四、小结
解释
- 特殊情况处理:首先检查除数是否为0,以及被除数为
Integer.MIN_VALUE
且除数为-1的特殊情况。- 符号处理:确定结果的符号,然后将被除数和除数都转换为正数(如果它们不是的话)。
- 位运算模拟除法:使用一个循环,从最高位(31位)开始,检查左移后的除数是否小于等于被除数。如果是,则从被除数中减去这个值,并将相应的商值(即
1 << i
)加到结果上。- 返回结果:根据原始的符号返回结果。
注意,这里使用
long
类型来避免在运算过程中发生整数溢出。在Java中,int
类型在执行某些操作时可能会溢出,而使用long
类型可以安全地处理更大范围的数值。最后,再将结果转换回int
类型(如果它不会超出int
的范围)。
结语
生活不止眼前的苟且
还有诗和远方的田野
!!!