Java: 如何使用数组求解大阶乘?

Java: How to solve a large factorial using arrays?

我能找到的所有在线解决方案都使用BigInteger,但我必须使用数组来解决这个问题。

我只是一个初学者,我什至把它带到了我的计算机科学俱乐部,甚至无法弄明白。

每次输入大于31的数字时,输出总是零。

另外,当我输入大于12的数字时,输出总是不正确。

例如fact(13) returns 1932053504 什么时候应该 return 6227020800

这是我目前的情况:

import java.util.Scanner;

class Fact
{
    public static void main(String[] args)
    {
        Scanner kb = new Scanner(System.in);
        System.out.println("Enter the number you wish to factorial");
        int x = kb.nextInt();
        System.out.println(fact(x));
    }

    public static int fact(int x)
    {
        int[] a = new int[x];

        int product = 1;

        for(int i = 0; i < a.length; i++)
        {
            a[i] = x;
            x--;
        }

        for(int i = 0; i < a.length; i++)
        {
            product = product * a[i];
        }

        return product;
    }
}

最大值使大数变得可怕

遗憾的是,由于 maximum values of integers and longs,您不能超过

多头:

2^63 - 1

9223372036854775807

9 quintillion 223 quadrillion 372 trillion 36 billion 854 million 775 thousand 807

对于整数:

2^31 - 1

2147483647

2 billion 147 million 483 thousand 647

(我写的名字是为了显示大小)

在计算过程中的任何时间点,你都会检查这些,"maximum values," 你会溢出变量,导致它的行为与你预期的不同,有时会导致形成奇怪的零。

即使 BigInteger 也有问题,尽管它可以达到比 longsints 更高的数字,这就是为什么它们与生成大量数字的方法一起使用的原因像阶乘。

您似乎想避免使用 BigInteger 并且只使用原始类型,因此 long 将是您可以使用的最大数据类型。

即使您将所有内容都转换为 long(当然数组迭代器除外),您也只能准确计算最多 20 的阶乘。超过这个值的任何东西都会溢出变量。这是因为21!超过 "maximum value" 多头。

简而言之,您需要使用 BigInteger 或创建自己的 class 来计算大于 20 的数字的阶乘。