就是先计算出部分卡塔兰数再根据输入输出相应的卡塔兰数。
计算卡塔兰数采用的是数组模拟大数运算
// 卡塔兰数递推公式 h(n)=h(n-1)*(4*n-2)/(n+1); h(1) = 1
#include<cstdio>
using namespace std;
int a[110][150]; // 存储卡塔兰数
int b[110]; // 保存第i个卡塔兰数的位数
void catalan() { //求卡特兰数
int i, j, len, carry, temp;
a[1][0] = b[1] = 1;
len = 1;
for(i = 2; i <= 100; i++) {
for(j = 0; j < len; j++) //乘法
a[i][j] = a[i-1][j]*(4*(i-1)+2);
carry = 0; // 进位表示
for(j = 0; j < len; j++) { //处理相乘结果
temp = a[i][j] + carry;
a[i][j] = temp % 10;
carry = temp / 10;
}
while(carry) { //进位处理
a[i][len++] = carry % 10;
carry /= 10;
}
carry = 0;
for(j = len-1; j >= 0; j--) { //除法
temp = carry*10 + a[i][j];
a[i][j] = temp/(i+1);
carry = temp%(i+1);
}
while(!a[i][len-1]) //高位零处理
len --;
b[i] = len;
}
}
int main(){
int n;
catalan();
while(scanf("%d", &n) != EOF){
for(int i = b[n] - 1; i >= 0; i--){
printf("%d", a[n][i]);
}
printf("\n");
}
return 0;
}