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