获得大量的因子

Rav*_*shi 0 java algorithm math factorial

可能重复:
计算任意大数的阶乘,显示所有数字

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

public long getFactorial(long number) {
    long factorial = 1;
    for (long i = 1; i <= number; ++i) {
        factorial *= i;
    }
    return factorial;
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 10

了解该值的范围为10 5565708.它将占用大约2兆字节的空间,这一切都是独立的.

这就是说,番石榴的 BigIntegerMath.factorial(int)是不够好,处理它,更重要的是,它实际上是为大阶乘优化-它会做显著比一个简单的好for环.(披露:我为番石榴做贡献......并写了很多BigIntegerMath.factorial自己.)

也就是说,我不会把它称为快速 - 我的基准测试表明该范围内的平均值为414ms - 但是没有一个真正快速的解决方案,不是没有极其重要的bignum库,我不希望甚至是显著更快.

如果您需要确切的值,那就是这样.如果你能够满足对数,那么,要么使用Apache logGamma(n+1)来获取ln(n!),要么自己近似:

double logFactorial = 0;
for (int i = 2; i <= n; i++) {
  logFactorial += Math.log(i);
}
Run Code Online (Sandbox Code Playgroud)

一些舍入误差可能会累积,但无论如何它应该是一个近似值.

  • @Louis Wasserman:你的意思是`factorial(1_000_000)`的414毫秒,真的吗?在我的电脑上,它需要超过200秒.我怀疑你的电脑比我的快500倍.任何解释? (2认同)