为什么乘积后我的乘积结果为0

时间:2020-05-18 03:05:34

标签: java

试图获得乘法结果 我正在尝试找出子阵列产品,但结果是0


public class SubArray {

        public void SubbArr(int arr[]) {
            int product = 1;
                for(int i=0;i<arr.length;i++) {
                    for(int j=i;j<arr.length;j++) {
                        for(int k=i;k<=j;k++) {
                            System.out.print(arr[k]+" ");
                            product = product*arr[k];
                        }
                        System.out.println();
                    }
                }
            System.out.println("product is:"+product);
        }

        public static void main(String[] args) {

            SubArray all = new SubArray();
            int arr[] = {1,2,3,4,5,6};
            all.SubbArr(arr);
            // TODO Auto-generated method stub
        }
    }

4 个答案:

答案 0 :(得分:3)

因为您超出了int最大值,所以得到了0

如果要获得结果,可以使用BigDecimal

    static void SubbArr(int arr[]) {
        BigDecimal product = new BigDecimal(1);
        for (int i = 0; i < arr.length; i++) {
            for (int j = i; j < arr.length; j++) {
                for (int k = i; k <= j; k++) {
                    System.out.print(arr[k] + " ");
                    product = product.multiply(BigDecimal.valueOf(arr[k]));
                }
                System.out.println();
            }
        }
        System.out.println("product is:" + product);
    }

更多信息:BigDecimal Oracle Doc

答案 1 :(得分:1)

您的乘法结果溢出。乘法结果太大,无法存储int类型。虽然,我不确定为什么它显示为0。也许是未定义的行为。您可能要为此使用Java BigInt类。

int是4字节数据类型,其最大值是2,147,483,647。在计算器中计算乘法结果,您会发现,如果附近有一个计算器来计算您提供的大乘法(尽管数组很小),则很大。尝试传递一个较小的数组,例如{1,2,3}

答案 2 :(得分:1)

您的问题是Integer Overflow

您的product的值超出了int可以容纳的最大值。

BigIntegerBigDecimal将助您一臂之力。


private static void SubbArr(int[] arr) {
    BigInteger product = BigInteger.ONE;
    for(int i = 0; i < arr.length;i ++) {
        for(int j = i; j < arr.length; j++) {
            for(int k = i ; k <= j; k++) {
                System.out.print(arr[k] + " ");
                product = product.multiply(BigInteger.valueOf(arr[k]));
            }
            System.out.println();
        }
    }
    System.out.println("product is: " + product);
}

旁注::我已经更改了您的代码样式,使其更具可读性。

答案 3 :(得分:0)

您的代码不仅在计算一个子数组乘积,而且还在计算 all 个连续的非空子数组乘积的乘积。您似乎没有考虑过结果可能有多大,所以让我们从计数子数组开始。这并不难:长度为1的6个,长度为2的5个,等等,以长度6的1结尾。这是21个因数,如果我们忽略相同的1个则为20个因数。 int,并且其中一个是符号位,因此应该已经可以使您的头疼了。

实际上,在各个子数组中计算2s(包括4s和6s中的2s)表明,您要计算的乘积是2 40 的倍数,这就是乘法溢出的原因到int结果全为零的结果 -它们是算术结果的32个最低有效位。

结果也是3 20 和5 10 的倍数。这些因素均大于2 20 ,因此您的总体产品超过2 80 。甚至long也无法容纳它;要计算出准确的结果,最好的选择可能是BigInteger