Catalan数的组合公式为 Cn=C(2n,n) / (n+1);
此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)
卡特兰数的一个应用:
给顶节点组成二叉树的问题。
给定N个节点,能构成多少种不同的二叉树?
(能构成h(N)个)
但因为每一个节点都被命名了,也就是每一个节点都当做 是不同的,所以最后每一个卡特兰数都要乘以n!
用组合公式化简得:h(n)=(2n)!/(n+1)! = 2n*(2n-1)* …… *(n+2)。
#include<iostream>
using namespace std;
#define MAX 100
int f[101][100];
inline void multiply(int a[],int Max,int b) //大数乘法,注意参数的传递
{
int i,s=0;
for (i = Max-1; i >= 0; i--)
{
s += b * a[i];
a[i] = s % 10000; // 数组每一位存放大数的四位数字
s /= 10000;
}
}
void init()
{
memset(f[1],0,MAX*sizeof(int));
f[1][MAX-1]=1;
for(int i=2;i<=100;i++)
{
f[i][MAX-1]=1;
for(int j=i*2;j>=i+2;j--)
multiply(f[i],MAX,j);
}
}
int main()
{
int n,i;
init();
while(cin>>n,n)
{
for (i = 0; i < MAX && f[n][i] == 0; i++); //去掉数组前为0的数字。
cout << f[n][i++]; //输出第一个非0数
for (; i < MAX; i++)
{
printf("%04d",f[n][i]); //输出后面的数,并每位都保持4位长度!(32767)
}
cout << endl;
}
return 0;
}