加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 大数据 > 正文

阶乘的精确值(大数)

发布时间:2021-02-02 15:47:07 所属栏目:大数据 来源:网络整理
导读:首先确定阶乘的位数。 我们知道整数n的位数的计算方法为:log10(n)+1 故n!的位数为log10(n!)+1 ? 如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解 ? 斯特林(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
?
所以采用下面代码计算阶乘位数,会非常快
#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,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;
}

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读