获得大量的因子

时间:2012-04-13 20:48:40

标签: java algorithm math factorial

  

可能重复:
  Calculate the factorial of an arbitrarily large number, showing all the digits

这个问题可能会在这里被问到一千次。我正在修改我的问题。我想计算一个大数的阶乘(max range of the number=10^6)。通常,我们使用从fori=1的{​​{1}}循环,并且每次将旧值乘以新值。这适用于小数字,但如果我有一个大数字呢? i=number循环的范围现在增加了。 Java原始数据类型forint无法处理结果大数。他们只是溢出。虽然我知道long类,它可以处理这个大输出,但仍然BigInteger循环不适合我。有人可以建议我任何勾选,任何黑客来计算一个数字的阶乘?下面是一个简单的程序,适用于少数 -

for

4 个答案:

答案 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.问题是什么?