hdu1023卡特兰数

来源:互联网 发布:淘宝梦想世界 编辑:程序博客网 时间:2024/06/11 18:13

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

#include <iostream>#include <algorithm>#include <iomanip>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;}
1 0
原创粉丝点击