Rav*_*shi 0 java algorithm math factorial
可能重复:
计算任意大数的阶乘,显示所有数字
这个问题可能会在这里问到千次.我正在修改我的问题.我想计算一个大数的阶乘(max range of the number=10^6).一般来说,我们使用一个for循环从i=1到i=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)
一些舍入误差可能会累积,但无论如何它应该是一个近似值.