题解 P1729 【计算e】

· · 题解

看到这题没有人写题解,那我就当第一个吧。

其实本题就是一个高除单和一个高精度加法。

直接上代码:

#include<cstdio>
const int N=2005;
const int M=100000;
int a[N],s[N],t[N],i,k,p,n;
//a数组存答案,1位存5个数字
//s数组存(1/n!),也是1位存5个数字
//t数组用来过渡
int f=true;
int main(){
    i=2;
    a[1]=s[1]=50000;
    //初始化:a数组和s数组都赋值为0.5,下面从1/3!算起
    while(f){
        i++;
        //当前算1/i!
        p=0;
        for(k=0;k<N;k++){
            p=p*M+s[k];
            t[k]=p/i;
            p%=i;
        }
        //高除单,i!=(1/(i-1)!)/i
        f=false;
        for(k=0;k<N;k++){
            a[k]+=s[k]=t[k];
            if(s[k])
                f=true;
            //当s数组为空时,退出循环
            if(a[k]>=M)
                a[k-1]+=a[k]/M,a[k]%=M;
        }
        //高精度加法,把s加进a
    }
    scanf("%d",&n);
    printf("2.\n");
    for(i=1;i*5<=n;i++){
        printf("%05d",a[i]);
        if(!(i%10))
            printf("\n");
        else
            if(!(i%2))
                printf(" ");
    }
    //输出
    if(i*5-n==4)printf("%d",a[i]/10000);
    if(i*5-n==3)printf("%02d",a[i]/1000);
    if(i*5-n==2)printf("%03d",a[i]/100);
    if(i*5-n==1)printf("%04d",a[i]/10);    
    //因为是5位5位输出,最后几位单独输出    
    return 0;
}