大数阶乘的位数和精确值计算【转】
2015-07-11 18:08
417 查看
来源:http://www.cnblogs.com/stonehat/p/3603267.html
在此,顶礼膜拜一下原文作者呵呵
斯特林(Stirling)公式:
如果要计算阶乘的精确值,则可以采用下面代码。
在此,顶礼膜拜一下原文作者呵呵
我们知道整数n的位数的计算方法为:log10(n)+1
故n!的位数为log10(n!)+1
如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解
斯特林(Stirling)公式:
于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1
即 1/2*log10(2*PI*n)+n*log10(n/e)+1
所以采用下面代码计算阶乘位数,会非常快
#define PI 3.141592654 #define E 2.71828182846 int l(int n) { int s=1; if(n>3) s=log10(2*PI*n)/2+n*log10(n/E)+1; return s; }
如果要计算阶乘的精确值,则可以采用下面代码。
/* 函数功能:计算并输出n 的阶乘 返回值:阶乘结果的位数 注意: 本程序直接输出n!的结果,需要返回结果请保留long a[] 需要 math.h */ int factorial(int n) { long a[10000]; int i,j,l,c,m=0,w; a[0]=1; for(i=1;i<=n;i++) { c=0; for(j=0;j<=m;j++) { a[j]=a[j]*i+c; c=a[j]/10000; a[j]=a[j]%10000; } if(c>0) {m++;a[m]=c;} } w=m*4+log10(a[m])+1; printf("\n%ld",a[m]); for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]); return w; }
相关文章推荐
- java开发必备的工具
- 汇编学习([BX]和loop指令)
- 2、附件上传到服务器及附件信息添加到数据库
- {A} + {B}
- {A} + {B} 分类: HDU 2015-07-11 18:06 6人阅读 评论(0) 收藏
- extern "C"的理解
- 女人需要调教人需要调教
- 关于理念(脑电波)这个想法
- IntelliJ IDEA 快捷键和设置
- java学习之旅54、55--读String类源码
- java中的访问权限
- PHP数组操作类实例
- Linux进程运行状态图
- linux的用户组,文件权限
- 用arm-linux-gdb调试ARM上的应用程序
- swift 拼图小游戏
- 批量删除VC6.0中的临时文件
- erlang源码安装笔记
- ViewFlipper使用方法
- PHP学习笔记-数组