Обратные цифры целого числа: Как узнать, переполнено ли число? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь решить проблему:

Если задано 32-разрядное целое число со знаком, обратные цифры целого числа возвращают 0 при переполнении обратного целого числа.

Мое решение:

public int reverse(int x)
{
    int reversedNumber = 0;
    boolean isNumberNegative = x < 0;
    x = Math.abs(x);
    while (x >= 10)
    {
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
    }
    reversedNumber = reversedNumber * 10 + x;
    return isNumberNegative ? -1 * reversedNumber : reversedNumber;
}

Моя проблема с переполнением, как мне узнать, переполнен ли reversedNumber без использования Math служебного класса или long и последующей проверки?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете попытаться сделать это так, без приведения:

public int reverse(int x) {
    int reversedNumber = 0;
    int digitCount = 1;
    x = Math.abs(x);
    while (x >= 10) {
        if(digitCount >= 9 && willOverflow(reversedNumber)){
            return 0;
        }
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
        digitCount++;
    }
    if(willOverflow(reversedNumber)){
        return 0;
    }
    reversedNumber = reversedNumber * 10 + x;
    if(reversedNumber < 0){
        return 0;
    }

    return reversedNumber;
}

private boolean willOverflow(int reversedNumber) {
    int tmpMultiply = reversedNumber * 10;
    int tmpDivide = tmpMultiply / 10;
    return tmpDivide != reversedNumber;
}

Если я верю, что вы можете проверить, переполнится ли целое число, умножив его на 10, а затем разделив на 10. Если значение в конце отличается от переданного значения, вы можете предположить, что целое число переполнится в следующей итерации (если будет быть следующей итерацией).

0 голосов
/ 10 января 2019

Вы можете использовать преобразование int в long и наоборот, так как long больше Integer.MAX_VALUE и меньше Integer.MIN_VALUE переполнится при приведении обратно к int, это может быть замеченным в последних 2 строках:

public int reverse(int x) {
    long reversedNumber = 0;
    boolean isNumberNegative = x < 0;
    x = isNumberNegative ? -x : x;
    while (x >= 10) {
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
    }
    reversedNumber = reversedNumber * 10 + x;
    reversedNumber = isNumberNegative ? -reversedNumber : reversedNumber;

    int result = (int) reversedNumber ;
    return reversedNumber != result ? 0 : result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...