-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的阶乘时,它会导致分段错误.请任何人都可以帮助我?
添加一个不给出该阶乘的精确值的答案,但给出该结果数的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位...
一个封闭的公式,不需要循环,给出了一个很好的因子近似.计算再次达到极限,所以做日志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
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |