3 回答
TA贡献2012条经验 获得超12个赞
我这样解决。优先考虑数据类型long在int只要有在左移溢出的机会。从一开始就处理边缘情况,以避免在过程中修改输入值。该算法基于我们过去在学校中使用的除法技术。
public int divide(int AA, int BB) {
// Edge case first.
if (BB == -1 && AA == Integer.MIN_VALUE){
return Integer.MAX_VALUE; // Very Special case, since 2^31 is not inside range while -2^31 is within range.
}
long B = BB;
long A = AA;
int sign = -1;
if ((A<0 && B<0) || (A>0 && B>0)){
sign = 1;
}
if (A < 0) A = A * -1;
if (B < 0) B = B * -1;
int ans = 0;
long currPos = 1; // necessary to be long. Long is better for left shifting.
while (A >= B){
B <<= 1; currPos <<= 1;
}
B >>= 1; currPos >>= 1;
while (currPos != 0){
if (A >= B){
A -= B;
ans |= currPos;
}
B >>= 1; currPos >>= 1;
}
return ans*sign;
}
TA贡献1815条经验 获得超10个赞
与调试器一起运行,发现它abs_dividend
为-2147483648。
那么in的比较结果while (abs_dividend >= abs_divisor) {
为假,count
并且永远不会递增。
原来的解释是在Javadoc中Math.abs(int a)
:
请注意,如果参数等于Integer.MIN_VALUE的值(最负的可表示int值),则结果是相同的值,该值为负。
大概是因为Integer.MAX_VALUE
2147483647,所以无法用来表示正2147483648 int
。(注意:2147483648将是Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
)
添加回答
举报