可能重复:
Calculate the factorial of an arbitrarily large number, showing all the digits
这个问题可能会在这里被问到一千次。我正在修改我的问题。我想计算一个大数的阶乘(max range of the number=10^6
)。通常,我们使用从for
到i=1
的{{1}}循环,并且每次将旧值乘以新值。这适用于小数字,但如果我有一个大数字呢? i=number
循环的范围现在增加了。 Java原始数据类型for
,int
无法处理结果大数。他们只是溢出。虽然我知道long
类,它可以处理这个大输出,但仍然BigInteger
循环不适合我。有人可以建议我任何勾选,任何黑客来计算一个数字的阶乘?下面是一个简单的程序,适用于少数 -
for
答案 0 :(得分:10)
了解该值在10 5565708 的范围内。它本身就占用了大约2兆的空间。
尽管如此,Guava's BigIntegerMath.factorial(int)
足以应对它,更重要的是,它实际上已经针对大型因子进行了优化 - 它比显着更好一个简单的for
循环。 (披露:我为Guava做贡献......并且自己写了很多BigIntegerMath.factorial
。)
那就是说,我不会把它称为快速 - 我的基准测试表明该范围内的平均值为414ms - 但是没有一个真正快速的解决方案,不是没有极其重要的bignum图书馆,我甚至不希望那些显着更快。
如果您需要确切的值,那就是。如果你能满足于对数,那么,要么使用Apache的logGamma(n+1)
来获取ln(n!)
,要么自己近似:
double logFactorial = 0;
for (int i = 2; i <= n; i++) {
logFactorial += Math.log(i);
}
某些舍入误差可能会累积,但无论如何它都应该是近似值。
答案 1 :(得分:2)
您可以使用名为Stirling's Formula的近似函数来获得如此大的n值。
您可以在此处参阅我的回答以获取更多详细信息: https://softwareengineering.stackexchange.com/questions/134968/number-of-combinations/134972#134972
答案 2 :(得分:1)
使用Gamma function。 Gamma(i + 1)= i!
org.apache.commons.math.special为Java提供了它。
人们通常做的是计算log(Gamma(i + 1))然后在对数空间中工作(乘法变成加法等)。
以下是一些快速计算阶乘的其他方法:http://www.luschny.de/math/factorial/FastFactorialFunctions.htm
答案 3 :(得分:0)
您对BigInteger
使用factorial
,而您仍需要long
i
,即循环变量。 i
只需要达到1000000.问题是什么?