微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

阶乘的精确值大数

首先确定阶乘的位数。


我们知道整数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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐