首页 > 解决方案 > 为什么我的计算是错误的?Java反向int问题

问题描述

这是我假设反转并返回给定整数的函数:

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

为什么会这样?也欢迎所有关于使这个功能更好的提示。

标签: javareverse

解决方案


也欢迎所有关于使这个功能更好的提示。

一个简单的实现可以如下:

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

推荐阅读