hdu1023卡特兰数

c(2n,n)-c(2n,n-1)
我只是觉得大数写的我要死。

#include 
#include 
#include 
using namespace std;
int *c[205][205];
const int base = 100000000;
void sum(const int *num1, int size1, const int *num2, int size2, int **num)
{
    int size = max(size1, size2) + 2;
    int digit = 1;
    int carry = 0;
    (*num) = new int[size];
    while (digit <= size1 && digit <= size2)
    {
        (*num)[digit] = num1[digit] + num2[digit] + carry;
        carry = (*num)[digit] / base;
        (*num)[digit] %= base;
        ++digit;
    }
    while (digit <= size1)
    {
        (*num)[digit] = num1[digit] + carry;
        carry = (*num)[digit] / base;
        (*num)[digit] %= base;
        ++digit;
    }
    while (digit <= size2)
    {
        (*num)[digit] = num2[digit] + carry;
        carry = (*num)[digit] / base;
        (*num)[digit] %= base;
        ++digit;
    }
    while (carry > 0)
    {
        (*num)[digit++] = carry;
        carry /= base;
    }
    (*num)[0] = digit - 1;
}

void sub(const int *num1, const int *num2, int **num)      //大减小
{
    int i, borrow;
    (*num) = new int[num1[0]];
    for (i = 1, borrow = 0; i <= num2[0]; ++i)
    {
        (*num)[i] = num1[i] - num2[i] - borrow;
        borrow = 0;
        while ((*num)[i] < 0)
        {
            (*num)[i] += base;
            ++borrow;
        }
    }
    while (i <= num1[0])
    {
        (*num)[i] = num1[i] - borrow;
        borrow = 0;
        while ((*num)[i] < 0)
        {
            (*num)[i] += base;
            ++borrow;
        }
        ++i;
    }
    while ((*num)[--i] == 0)
        continue;
    (*num)[0] = i;
}
void print(const int *a)
{
    int digit = a[0];
    cout << a[digit--];
    while (digit > 0)
        cout << setw(8) << setfill('0') << a[digit--];      //在这错了超多次
    cout << endl;
}

int main(void)
{

    ios::sync_with_stdio(false);
    c[0][0] = new int[2];
    c[0][0][0] = 1;
    c[0][0][1] = 1;
    for (int i = 1; i != 205; ++i)
    {
        c[i][0] = new int[2];
        c[i][0][0] = 1;
        c[i][0][1] = 1;
        c[i][i] = new int[2];
        c[i][i][0] = 1;
        c[i][i][1] = 1;
    }
    for (int i = 2; i != 205; ++i)
        for (int j = 1; j != i; ++j)
            sum(c[i - 1][j - 1], c[i - 1][j - 1][0], c[i - 1][j], c[i - 1][j][0], &c[i][j]);
    int n;
    while (cin >> n)
    {
        int *ans;
        sub(c[2 * n][n], c[2 * n][n - 1], &ans);
        print(ans);
        delete[] ans;
    }

    return 0;
}

你可能感兴趣的:(普通算法)