我需要在c中得到1000000的阶乘

-2 c abstract-data-type factorial

double factorial(int x) {
if (x >= 1)
    return x * factorial(x - 1);
else
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

当我试图获得1000000的阶乘时,它会导致分段错误.请任何人都可以帮助我?

Rin*_*g Ø 5

添加一个不给出该阶乘的精确值的答案,但给出该结果数的10.

要做到这一点,让我们用Y =日志10(X) ,使该ŸX = 10 ÿ.

例如,log 10(1000000)是6(6个零,10 6).和日志10(9500)为〜3.98,因为我们正在接近10 4.

然后log(a * b)log(a) + log(b),这是在我们的情况是非常有用的,因为fact(x)x*(x-1)*(x-2)*...*1).

现在正如@dbush所说,你不能递归循环1M次,因为保存返回地址(和局部变量)的堆栈会很快溢出.所以让我们做一个循环

double d,pow10 = 0.0;
for(d=1 ; d<=1000000 ; d++) pow10 += log10(d);
printf("Result is 10^ %.02lf\n", pow10);
Run Code Online (Sandbox Code Playgroud)

做到了,结果是~ 10 5565708.92,一个数字~5565709位...


你也可以使用Gosper的优秀近似值(在Math SE上讨论)

Gosper的近似值

一个封闭的公式,不需要循环,给出了一个很好的因子近似.计算再次达到极限,所以做日志10,有log(a b)= b*log(a)

1000000*log(1000000) - 1000000*log(e) + log(sqrt((2000000+1/3)*PI))
Run Code Online (Sandbox Code Playgroud)

也给出~5565708.92,阶乘为~ 10 5565708.92