阶乘的精确值(大数)
2016-09-07 11:01
302 查看
首先确定阶乘的位数。
斯特林(Stirling)公式:
![](https://img-blog.csdn.net/20160907105035210?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
求大整数阶乘
肯定用数组模拟了,于是先用上面的代码测试一下需要求的数的长度。
算了一下1997阶乘的长度大概是5000多,于是我们开一个6000的数组。
然后从1开始像上面模拟阶乘的运算。
用f[0]保存1,f[1] f[2]....依次保存高位。
我们知道整数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
所以采用下面代码计算阶乘位数,会非常快
#include <math.h> #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; }以上转载至http://www.cnblogs.com/stonehat/p/3603267.html
求大整数阶乘
肯定用数组模拟了,于是先用上面的代码测试一下需要求的数的长度。
算了一下1997阶乘的长度大概是5000多,于是我们开一个6000的数组。
然后从1开始像上面模拟阶乘的运算。
用f[0]保存1,f[1] f[2]....依次保存高位。
int main(void){ //cout<<l(1997)<<endl; int i,j,n; scanf("%d",&n); memset(f,0,sizeof(f)); f[0]=1; for(i=2;i<=n;i++){ int c=0; for(j=0;j<=maxn-1;j++){ //最多也进位不到maxn位 int s=f[j]*i+c; f[j]=s%10;//个位保留 c=s/10;//进位 } } for(j=maxn-1;j>=0;j--){ if(f[j]){ break; //找到最高位 } } for(i=j;i>=0;i--){ printf("%d",f[i]); } printf("\n"); return 0; }
相关文章推荐
- 大数阶乘的位数和精确值计算
- 大数阶乘的位数和精确值计算
- 大数阶乘的位数和精确值计算
- 阶乘类,可以精确计算大数的阶乘,10000的阶乘只要1.3秒左右
- C#阶乘类,可以精确计算大数的阶乘,10000的阶乘只要1.3秒左右
- C#阶乘类,可以精确计算大数的阶乘,10000的阶乘只要1.3秒左右
- 精确大数阶乘
- 大数阶乘的位数和精确值计算【转】
- 精确大数阶乘
- 阶乘的精确值&大数阶乘
- (N!)大数阶乘 模板
- 大数阶乘
- 51nod_1057 N的阶乘(大数)
- Algorithm学习笔记 --- 大数阶乘算法模板
- 南阳理工大数阶乘
- 利用数组实现大数的阶乘
- 【大数阶乘 28】
- 大数问题——大数阶乘
- 大数阶乘的计算(五)
- 大整数相乘和大数阶乘实现