由于溢出,使用原始int数据类型无法找到大于或等于13的数字的阶乘太大而int变量无法容纳,其最大值仅为2147483647(2 ^ 31 -1)。即使我们使用long数据类型,大于或等于21的阶乘也会产生溢出。要计算大于21的阶乘,需要使用java.math包中的BigInteger类。顾名思义,BigInteger类旨在容纳非常大的整数值,该值甚至大于长整型数的最大值,例如2 ^ 63 -19223372036854775807L。但不能使用递归来计算较大数量的阶乘,而是需要为此使用for循环。

还值得注意的是,类似于java.lang.String和其他包装器类, BigInteger在Java中也是不可变的,这意味着将结果存储回相同的变量很重要,否则,计算结果将会丢失。BigInteger将数字存储为2的补数。此外,它还支持模块化算术,位操作,素数测试,素数生成,GCD计算和其他其他操作。

实现

public static String bigNumberFactorial(int num){
        BigInteger res = BigInteger.ONE;
        for (int i = num; i > 0; --i){
            res = res.multiply(BigInteger.valueOf(i));
        }
        return res.toString();
}