Integer.MIN_VALUE разделить на -1
почему эта строка кода имеет значение?(я получаю неправильный ответ без него)
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
Вопрос:
Разделите два целых числа без использования умножения, деления и оператора мод.
Если это переполнение, верните 2147483647
Ответ
public int divide(int dividend, int divisor) {
if(divisor == 0){
return dividend > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
if(dividend == 0){
return 0;
}
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);
Long up = Math.abs((long) dividend);
Long down = Math.abs((long) divisor);
int res = 0;
while(up >= down){
int shift = 0;
while(up >= (down << shift)){
shift++;
}
up -= down << (shift - 1);
res += 1 << (shift - 1);
}
return isNeg ? -res : res;
}
2 ответа
Решение
Ява использует 32 бита для хранения int
,
Максимальное значение int составляет 231-1
0111 1111 1111 1111 1111 1111 1111 1111
Минимальное значение int составляет -231
1000 0000 0000 0000 0000 0000 0000 0000
Другими словами, int не имеет достаточно большого значения для хранения 231(-Integer.MIN_VALUE
).
Потому что абсолютные значения Integer.MAX_VALUE
а также Integer.MIN_VALUE
не равны
Integer.MAX_VALUE
является2147483647
Integer.MIN_VALUE
является-2147483648
В случае, если вы разделите Integer.MIN_VALUE
от -1
, значение будет переполнено (2147483648 > 2147483647
), таким образом, должен быть предел для этой операции.