題目是說給出一個數字,然後以1到這個數為序號當做二叉樹的結點,問總共有幾種組成二叉樹的方式。這個題就是用卡特蘭數算出個數,然後因為有編號,不同的編號對應不同的方式,所以結果是卡特蘭數乘這個數的階乘種方案。因為數字比較大,所以要用高精度的方法也就是用字符數組來做,我分別寫了三個函數,一個算加法,一個算乘法,最後一個打表,等打出表來最後只要判斷一下輸入的數是第幾個,直接輸出就行了,下面是我的代碼,第一次寫高精度的這種大數處理,可能看上去比較繁瑣= =
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char ans[105][1005];
char ads[1005],mus[1005];
char jc[105][1005];
char res[105][1005];
int multiply(char* a1,char* b1)
{
memset(mus,0,sizeof(mus));
int i,j,k;
int len,len1,len2;
len1=strlen(a1);
len2=strlen(b1);
int mut=0,t;
bool va[1005];
int s[1005],adt[1005];
char a[1005],b[1005];
memset(s,0,sizeof(s));
memset(adt,0,sizeof(adt));
memset(va,0,sizeof(va));
for(i=len1-1,j=0;i>=0;i--)
{
a[i]=a1[j];
j++;
}
for(i=len2-1,j=0;i>=0;i--)
{
b[i]=b1[j];
j++;
}
for(i=0;i<len1;i++)
{
mut=0;
for(j=0;j<len2;j++)
{
t=(a[i]-'0')*(b[j]-'0')+mut;
mut=0;
if(t>=10)
{
mut=t/10;
t=t%10;
}
s[i+j]=t+s[i+j]+adt[i+j];
va[i+j]=1;
adt[i+j]=0;
if(s[i+j]>=10)
{
if(!va[i+j+1])
adt[i+j+1]=s[i+j]/10+adt[i+j+1];
else
adt[i+j+1]=s[i+j]/10;
s[i+j]=s[i+j]%10;
}
}
s[i+j]=mut;
}
s[i+j-1]=mut+adt[i+j-1];
if(s[i+j-1]!=0)
k=i+j-1;
else
k=i+j-2;
for(i=k,j=0;i>=0;i--)
{
mus[i]=(s[j]+'0');
j++;
}
return 0;
}
int additive(char* a,char* b)
{
memset(ads,0,sizeof(ads));
int len,len1,len2;
int i;
int ad[1005];
len1=strlen(a);
len2=strlen(b);
if(len1==len2)
{
len=len1;
}
else if(len1>len2)
{
len=len1;
for(i=len;i>=len-len2;i--)
{
b[i]=b[i-len+len2];
}
for(i=len-len2-1;i>=0;i--)
{
b[i]='0';
}
}
else if(len1<len2)
{
len=len2;
for(i=len;i>=len-len1;i--)
{
a[i]=a[i-len+len1];
}
for(i=len-len1-1;i>=0;i--)
{
a[i]='0';
}
}
int t=0;
for(i=len-1;i>=0;i--)
{
ad[i]=(a[i]-'0')+(b[i]-'0')+t;
t=0;
if(ad[i]>=10)
{
t++;
ad[i]=ad[i]-10;
ads[i]=ad[i]+'0';
}
else
{
ads[i]=ad[i]+'0';
}
}
if(t==1)
{
for(i=len;i>=0;i--)
{
ads[i]=ads[i-1];
}
ads[0]='1';
}
return 0;
}
int excel()
{
ans[0][0]='1';
ans[1][0]='1';
char sum[105];
int n;
int i,j;
char t[5];
memset(sum,0,sizeof(sum));
for(i=2;i<=100;i++)
{
for(j=i;j>0;j--)
{
multiply(ans[i-j],ans[j-1]);
additive(mus,sum);
strcpy(sum,ads);
}
strcpy(ans[i],sum);
memset(sum,0,sizeof(sum));
}
jc[1][0]='1';
for(i=2;i<100;i++)
{
memset(t,0,sizeof(t));
if(i>=10)
{
t[0]=i/10+'0';
t[1]=i%10+'0';
}
else
{
t[0]=i+'0';
}
multiply(jc[i-1],t);
strcpy(jc[i],mus);
}
multiply(jc[99],"100");
strcpy(jc[100],mus);
for(i=1;i<=100;i++)
{
multiply(ans[i],jc[i]);
strcpy(res[i],mus);
//cout<<"res["<<i<<"]="<<res[i]<<endl;
}
return 0;
}
int main()
{
int n;
excel();
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
cout<<res[n]<<endl;
}
return 0;
}