题解 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;
}