找回密码
 欢迎注册
查看: 25416|回复: 18

[提问] 阶乘有多少位?

[复制链接]
发表于 2010-1-19 23:08:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
一个数的阶乘有多少位,有好的算法吗 比如四百万的阶乘有 24671066位
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-20 00:01:28 | 显示全部楼层
本帖最后由 KeyTo9_Fans 于 2010-1-20 00:11 编辑 这是什么公式来着? $n! = \sqrt(2\pi(n+1/6+1/(72n))) * (n/e)^n$ 其中$1/6$和$1/(72n)$这两项是我自己凑的。 据测试,多了那两项可以修正结果,以至于有效数字比原来多了2倍。 两边取对数,得 $log(n!) = log(2\pi(n+1/6+1/(72n)))/2 + n*(log(n)-log(e))$ 把$n=4000000$代进去算,得到 $log(4000000!) = 24671065.737818781141945821796116$ 大概这几位数字 $24671065.7378187811419458217961$ 是有效的吧,后面的$...16$可能就不精确了。 即便如此,我们已经可以得到精确值的位数,以及精确值的前面若干位有效数字。

评分

参与人数 1鲜花 +8 收起 理由
wayne + 8 你的公式太强悍了 向上取整,一点都不差! ...

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-20 08:18:51 | 显示全部楼层
Stirling's formula
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-20 08:21:35 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-20 09:07:26 | 显示全部楼层
哦,谢谢各位了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-20 12:40:26 | 显示全部楼层
这是什么公式来着? $n! = \sqrt(2\pi(n+1/6+1/(72n))) * (n/e)^n$ 其中$1/6$和$1/(72n)$这两项是我自己凑的。 $log ... KeyTo9_Fans 发表于 2010-1-20 00:01
这个KeyTo9_Fans 公式虽然在逼近n!上还可以有改进的空间, 但用来求阶乘的位数,恰到好处,已经是简洁到不能再简洁的了!!!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-20 12:59:23 | 显示全部楼层
本帖最后由 wayne 于 2010-1-20 13:35 编辑 哦,用来求大于1的数的阶乘的位数, Stirling's formula 已经足够了 $\lceil n(\log _{10}n-\log _{10}\e)+\frac{1}{2}\log _{10}(2\pi n)\rceil $ 而逼近n!,更好的是: $n! = \sqrt(2\pi(n+1/6+1/(36.4+70.3n))) * (n/e)^n$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-20 19:45:57 | 显示全部楼层
本帖最后由 KeyTo9_Fans 于 2010-1-20 19:48 编辑 关于根号里第3项的分母,楼上是怎么得到$36.4+70.3n$的? 我通过计算1000000000的阶乘的准确值(仅保留100位有效数字),然后倒过来推根号里面的多项式,可以得到 $n! =sqrt(2\pi p)*(n/e)^n$ 其中 $p=n+1/6+a/n+b/n^2+c/n^3+d/n^4+e/n^5+f/n^6+g/n^7$ $a = 1/72$ $b = -31/6480$ $c = -139/155520$ $d = 9871/6531840$ $e = 324179/1175731200$ $f = -8225671/7054387200$ $g = -69685339/338610585600$ 到这里,已经把100位有效数字全部用完了,无法再继续考察下一项了。 要得到更多的项,需要计算比1000000000更大的阶乘的准确值,并保留更多的有效数字。 把$n=16$代进去算,得到的结果为 $20922789887999.748608502448646388$ 四舍五入到整数,与真实值 $16! =20922789888000$ 完全相同。 因为根号里的多项式有9项,所以上述公式的大致趋势是$n$每增大10倍,$n!$的有效数字增加9个。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-20 20:46:58 | 显示全部楼层
11.jpg 12.jpg
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-1-20 20:52:42 | 显示全部楼层
本帖最后由 wayne 于 2010-1-20 20:54 编辑 用C打印大数的阶乘,终于完成了,刚出锅,还是热的,高手们看看还有没有可以改进的地方
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. int main(){
  5. int i,j,*f,tmp,c=0;
  6. long int n,bits;
  7. const double PI=2*asin(1.0),E=exp(1.0);
  8. scanf("%ld",&n);
  9. bits=(long)ceil(n*(log10(n)-log10(E))+log10(2*PI*n)/2);
  10. printf("there are %ld digits\n%ld!=",bits,n);
  11. f=(int*)calloc(bits,sizeof(int));
  12. f[0]=1;
  13. for(i=2;i<=n;i++){
  14. for(j=0;j<bits;j++){
  15. tmp=f[j]*i+c;
  16. c=tmp/10;
  17. f[j]=tmp%10;
  18. } }
  19. for(i=bits-1;i>=0;i--) printf("%d",f[i]);
  20. printf("\n");
  21. return 0;
  22. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-23 16:21 , Processed in 0.031871 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表