Почему мои расчеты неверны? Java обратная проблема int - PullRequest
0 голосов
/ 20 июня 2020

Вот моя функция, которая должна отменить и вернуть целое число дающего:

public static int reverse(int x) {
    List<Integer> digits = new ArrayList<>();
    int result = 0, count = 0;

    while(x != 0)   {
        digits.add(x % 10);
        x /= 10;
        count++;
    }
    System.out.println(digits);
    int i = 0;
    while(count != 0) {
        result += digits.get(i) * (int) Math.pow(10, count - 1);
        System.out.printf("result: %d i: %d, count: %d - ", result,  i, count);
        System.out.printf("%d * %d\n", digits.get(i), (int) Math.pow(10, count - 1));
        count--;
        i++;
    }

    return result;
}

Я столкнулся с проблемой. Например, когда я передаю значение 1534236469, происходит следующее:

    result: 410065408 i: 0, count: 10 - 9 * 1000000000
    .
    . 
    .
    1056389759

Почему это происходит? Также приветствуются все советы по улучшению этой функции.

Ответы [ 4 ]

2 голосов
/ 20 июня 2020

Также приветствуются все советы по улучшению этой функции.

Простая реализация может быть следующей:

public class Main {
    public static void main(String[] args) {
        int x = 123456789;
        int y = reverse(x);
        System.out.println(x);
        System.out.println(y);
    }

    public static int reverse(int x) {
        return Integer.parseInt(new StringBuilder(String.valueOf(x)).reverse().toString());
    }
}

Вывод:

123456789
987654321

Кроме того, как уже упоминалось в комментарии, когда вы присваиваете значение, превышающее максимально допустимое, переменной int, значение преобразуется в значение с другого конца, т.е. Integer.MAX_VALUE + 1 становится Integer.MIN_VALUE. Следовательно, для целого числа, такого как 1534236469, обратное значение которого больше, чем может содержать int переменная, вы должны преобразовать обратное значение в значение long, как показано ниже:

public class Main {
    public static void main(String[] args) {
        int x = 1534236469;
        long y = reverse(x);
        System.out.println(x);
        System.out.println(y);
    }

    public static long reverse(int x) {
        return Long.parseLong(new StringBuilder(String.valueOf(x)).reverse().toString());
    }
}

Вывод :

1534236469
9646324351
1 голос
/ 20 июня 2020

Я думаю, что проблема может заключаться в том, что реверс int не всегда является int.

2147483647 - это max int, поэтому

9646324351

слишком велик и 1534236469 не имеет шансов

1 голос
/ 20 июня 2020

Более правильный способ перевернуть целое число:

int reverse(int n) {
    int reversed = 0;
    Boolean isNegative = n < 0;
    n = Math.abs(n);
    
    while(n > 0) {
        reversed = reversed * 10 + (n % 10);
        n /= 10;
    }
    
    if (isNegative)
        reversed *= -1;
    
    return reversed;
}
1 голос
/ 20 июня 2020

Марчин, вы можете реализовать свой обратный метод, как показано ниже,

public static long reverse(int x) {
    long reverseDigit = 0;
    while (x != 0) {
        reverseDigit = reverseDigit * 10 + (x % 10);
        x /= 10;
    }
    return reverseDigit;
}

Надеюсь, это поможет.

...