Divide two integers without using multiplication, division and mod operator.
思路:对于被除数dividend和除数divisor,我们需要做的工作是以下两步:
(1)判断运算结果符号。通过无符号右移运算,把符号位移到最低位,这里是右移31位(int为4字节32位,其中首位用0表示正数,用1表示为负数)。得到两数的符号位后,再将两数的符号位进行异或运算,得到最后的运算结果符号。
(2)计算两数绝对值的乘积(需要进行long转换操作,否则对Integer.MIN_VALUE求绝对值会溢出,像(-128,127)。两数取绝对值,进行累积减法运算,设置一个倍数标志count,若被除数大于除数,将被除数累积减去除数,同时倍数标志count自增加1,为防止重复运算,即为了提高运算效率,每一次将除数乘以2,被除数减去翻倍后的除数,同时倍数标志count也应当翻倍自增,这样加快了程序的执行效率。若进行一步步地减去除数操作,则程序运行会超时。
Java代码实现
import java.lang.Math;
public class Solution {
public int divide(int dividend, int divisor) {
long div_num1 = Math.abs((long)dividend);
long div_num2 = Math.abs((long)divisor);
int res = 0;
while(div_num1 >= div_num2){
int count = 1;
long sum = div_num2;
while(sum << 1 <= div_num1){
sum = sum << 1;
count = count << 1;
}
div_num1 = div_num1 - sum;
res += count;
}
return (dividend >>> 31 ^ divisor >>> 31) == 1 ? -res : res;
}
}
也可改成以下代码,效果一样
import java.lang.Math;
public class Solution {
public int divide(int dividend, int divisor) {
long div_num1 = Math.abs((long)dividend);
long div_num2 = Math.abs((long)divisor);
int res = 0;
while(div_num1 >= div_num2){
int count = 1;
long sum = div_num2;
while(sum + sum <= div_num1){
sum += sum;
count += count;
}
div_num1 = div_num1 - sum;
res += count;
}
return (dividend >>> 31 ^ divisor >>> 31) == 1 ? -res : res;
}
}