hdu 1023 卡塔兰数

就是先计算出部分卡塔兰数再根据输入输出相应的卡塔兰数。
计算卡塔兰数采用的是数组模拟大数运算

//  卡塔兰数递推公式 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40721694/article/details/82385479