递推式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);
}
}