#include<iostream> #include<cstdio> #include<cstring> #define MAX_N 110 using namespace std; int f[MAX_N][MAX_N],c[MAX_N]; inline int len(int a[]) { int i; for(i=60;i>=0;i--)//想要100个以上,这个i的范围要改 { if(a[i]!=0) break; } return i; } inline void add(int a[],int b[],int w)//高精加法 { int lena=len(a),lenb=len(b); for(int i=0;i<=max(lena,lenb);i++) { f[w][i]=a[i]+b[i]; } for(int i=0;i<=max(lena,lenb)+1;i++) { f[w][i+1]+=f[w][i]/10; f[w][i]%=10; } } inline void Catalan(int a[],int b[])//卡特兰 { memset(c, 0, sizeof(c)); int lena=len(a),lenb=len(b); for (int i=0;i<=lena;i++){ for (int j=0;j<=lenb;j++) c[i+j]+=a[i]*b[j]; } for (int i=0;i<=lena+lenb+1;i++) { c[i+1]+=c[i]/10; c[i]%=10; } } int main() { //int k; freopen("Catalan.txt","w"stdin);//文件操作; f[0][0]=f[1][0]=1; for (int i=2;i<=100;i++)//同理,要多输出几个i就等于几 { for (int j=0;j<i;j++) { Catalan(f[j], f[i-j-1]); add(f[i],c,i); } } for(int i=1;i<=100;i++)//输出 卡特兰数 1-100,范围同上,要输出几个自己改 { for (int j=len(f[i]);j>=0;j--) { //printf("%d",f[i][j]); putchar((char)f[i][j]+'0');//比printf稍快? } printf("\n"); } return 0; }