递推式a[i+1]=a[i]*(a[i]+1) 输出的是a[i]+1
要用高精度,最后答案在5.2w位左右。
#include <iostream> #include <string.h> using namespace std; #define DIGIT 4 #define DEPTH 10000 #define MAX 15000 typedef int bignum_t[MAX+1]; void write(const bignum_t a,ostream& os=cout){ int i,j; for (os<<a[i=a[0]],i--;i;i--) for (j=DEPTH/10;j;j/=10) os<<a[i]/j%10; } void add(bignum_t a,const int b){ int i=1; for (a[1]+=b;a[i]>=DEPTH&&i<a[0];a[i+1]+=a[i]/DEPTH,a[i]%=DEPTH,i++); for (;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++); } void mul(bignum_t c,const bignum_t a,const bignum_t b){ int i,j; memset((void*)c,0,sizeof(bignum_t)); for (c[0]=a[0]+b[0]-1,i=1;i<=a[0];i++) for (j=1;j<=b[0];j++) if ((c[i+j-1]+=a[i]*b[j])>=DEPTH) c[i+j]+=c[i+j-1]/DEPTH,c[i+j-1]%=DEPTH; for (c[0]+=(c[c[0]+1]>0);!c[c[0]]&&c[0]>1;c[0]--); } bignum_t a[20],tmp; int main(){ int n,i,j; double left; cin>>n; a[1][0]=1; a[1][1]=2; left=0.5; cout<<"2\n"; for (i=2;i<=n;i++){ memcpy(tmp,a[i-1],sizeof(tmp)); add(tmp,1); write(tmp);cout<<endl; if (i<n) mul(a[i],a[i-1],tmp); //a[i]=a[i-1]*(a[i-1]+1); } }