在java中不使用乘法,除法和mod运算符来除以两个整数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java中不使用乘法,除法和mod运算符来除以两个整数相关的知识,希望对你有一定的参考价值。
我写下了一个代码,该代码在除以两个数之后找出商,但不使用乘法,除法或mod运算符。
我的代码
public int divide(int dividend, int divisor) {
int diff=0,count=0;
int fun_dividend=dividend;
int fun_divisor=divisor;
int abs_dividend=abs(dividend);
int abs_divisor=abs(divisor);
while(abs_dividend>=abs_divisor){
diff=abs_dividend-abs_divisor;
abs_dividend=diff;
count++;
}
if(fun_dividend<0 && fun_divisor<0){
return count;
}
else if(fun_divisor<0||fun_dividend<0) {
return (-count);
}
return count;
}
我的代码传递了测试用例,如dividend = -1,divisor = 1或dividend = 1和divisor = -1。但它无法通过测试用例如dividend = --2147483648和divisor = -1。但是当两个输入都是负数时,我有一个if语句。
if(fun_dividend<0 && fun_divisor<0){
return count;
}
当我的输入是-2147483648和-1时它返回零。我调试了我的代码并发现它无法到达while循环的内部语句。它只是检查while循环并终止并执行
if(fun_dividend<0 && fun_divisor<0){
return count;
}
很明显,两个输入都是负数,所以我使用Math.abs
函数使它们变为正数。但是当我试图看到变量abs_dividend和abs_divisor的值时,它们会显示负值。
整数最大值可以取9位数。那我怎么能通过这个测试用例呢?根据此测试用例,被除数是一个10位数字,对整数范围无效。
根据测试用例,我得到的输出应该是2147483647。
我怎么能解决这个bug?
先感谢您。
跟着调试器一起发现abs_dividend
是-2147483648。
那么while (abs_dividend >= abs_divisor) {
的比较是假的,count
永远不会增加。
原来解释是在Math.abs(int a)
的Javadoc中:
请注意,如果参数等于Integer.MIN_VALUE的值,即最负的可表示的int值,则结果是相同的值,即负值。
据推测,这是因为Integer.MAX_VALUE
是2147483647,因此无法用int
表示正2147483648。 (注意:2147483648将是Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
)
尝试使用位操作,如下所示:
public static int divideUsingBits(int dividend, int divisor) {
// handle special cases
if (divisor == 0)
return Integer.MAX_VALUE;
if (divisor == -1 && dividend == Integer.MIN_VALUE)
return Integer.MAX_VALUE;
// get positive values
long pDividend = Math.abs((long) dividend);
long pDivisor = Math.abs((long) divisor);
int result = 0;
while (pDividend >= pDivisor) {
// calculate number of left shifts
int numShift = 0;
while (pDividend >= (pDivisor << numShift)) {
numShift++;
}
// dividend minus the largest shifted divisor
result += 1 << (numShift - 1);
pDividend -= (pDivisor << (numShift - 1));
}
if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) {
return result;
} else {
return -result;
}
}
以上是关于在java中不使用乘法,除法和mod运算符来除以两个整数的主要内容,如果未能解决你的问题,请参考以下文章