【问题标题】:Array form of integer数组形式的整数
【发布时间】:2022-12-09 19:03:14
【问题描述】:

我试图将数组转换为整数 sum=99999999999(12 个 9),当我将数组限制为小于 10 个 9 时,它给出了结果,但是当我给出超过 10 个 9 的数组时,它给出了一个意想不到的结果结果,请解释这对我真的很有帮助

int[] arr={9,9,9,9,9,9,9,9,9,9,9,9};
int p=arr.length-1;
int m;
int num=0;
for (int i = 0; i <= p; i++) {
    m=(int) Math.pow(10, p-i);
    num += arr[i]*m;           // it is executing like: 900+90+9=999
}

【问题讨论】:

标签: java arrays


【解决方案1】:

发生这种情况是因为您超出了Integer.MAX_VALUE

你可以阅读它here

您可以使用 long 代替 int 来存储大值, 如果这对你来说还不够,你可以使用 - BigInteger

BigInteger num = BigInteger.valueOf(0);
for (int i = 0; i <= p; i++) {
    BigInteger m = BigInteger.valueOf((int) Math.pow(10, p-i));
    BigInteger next =  BigInteger.valueOf(arr[i]).multiply(m));
    num = num.add(BigInteger.valueOf(arr[i]*m));
}

【讨论】:

    【解决方案2】:

    几件事。

    • 您不需要使用Math.pow
    • 对于最多 18 位数字,您可以使用 long 进行计算。
    • 我添加了一些额外的数字来演示
    int[] arr={9,9,9,9,9,9,9,9,9,9,9,9,1,1,2,3,4};
    
    long sum = 0;             // or BigInteger sum = BigInteger.ZERO;
    for (int val : arr) {
        sum = sum * 10 + val; // or sum.multiply(BigInteger.TEN).add(BigInteger.valueOf(val));
    }
    System.out.println(sum);
    

    印刷

    99999999999911234
    

    这是 1,2,3,4 的序列,因此您可以看到发生了什么。

    - sum = 0
    - sum = sum(0) * 10 + 1 (sum is now 1)
    - sum = sum(1) * 10 + 2 (sum is now 12)
    - sum = sum(12)* 10 + 3 (sum is now 123)
    - sum = sum(123)*10 + 4 (sum is now 1234)
    

    【讨论】:

      【解决方案3】:

      这是因为 int 是按 4 字节编码的,所以技术上你只能从 -2,147,483,648 到 2,147,483,647。 考虑使用 long 类型。

      【讨论】:

        【解决方案4】:

        尝试使用 long(或任何其他可以表示更大数字的类型)而不是 int。 我建议这样做是因为 int 溢出:请参阅https://en.wikipedia.org/wiki/Integer_overflow

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加更多详细信息,以帮助其他人了解这如何解决所提出的问题。你可以在in the help center找到更多关于如何写出好的答案的信息。
        【解决方案5】:

        因为它溢出了整数边界。 Java 中可以存储的最大整数值是 2147483647。当你试图存储一个大于这个的值时,结果将是一个意想不到的值。要解决此问题,您可以使用 long 数据类型而不是 int 数据类型

        你可以阅读它herehere

        【讨论】:

        • 您的答案可以通过其他支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写出好的答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2016-10-08
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多