我使用GMP计算非常大的阶乘(例如234234!)。有没有知道的任何方式,一个不计算之前,有多少位数字的结果将(或可能)是什么?

有帮助吗?

解决方案

的的对数的阶乘可以被用来计算数字,该数阶乘将采取数:

“LOGN!”

此可以很容易地转换为一个算法形式:

//Pseudo-code
function factorialDigits (n) 
  var result = 0;

  for(i = 1; i<=n; i++)
    result += log10(n);

  return result;

其他提示

您可以将斯特灵公式公式用简单的数学对数,让你数的位数:

n!         ~ sqr(2*pi*n) * (n/e)^n
log10(n!)  ~ log10(2*pi*n)/2 + n*log10(n/e)

硬件浮动的数学是足够的,这使得它闪电快。

斯特灵公式给出的n的尺寸的近似!

“替代文字”

用于推导请参阅维基百科页。

这将是

nlog(n) - n + log(n(1 + 4n(1 + 2n)))/6 + log(pi)/2

见主题@ http://en.wikipedia.org/wiki/Factorial “增长率” 斯里尼瓦沙的Ramanujan方法

是,请参阅斯特林近似

报告说,N! 〜= SQRT(2 * PI n)的(N / E)^ N。要获得的位数,取1点+的log(n!)/日志(10)。

好约四人提到斯特林所以...另一个选项是一个LUT存储的位数为每个第一N阶乘。假设4个字节用于整数和4个字节用于数字的位数,则可以在第一百万阶乘存储在周围8MB。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top