计算第n个加泰罗尼亚数字

时间:2014-08-28 02:34:45

标签: c++ recursion numbers catalan

我写了一些代码来计算第N个加泰罗尼亚数字。但是,当N = 20及以后,它不会返回正确的结果。 N <20时的结果是正确的,所以我不确定是什么问题。

所以,当N = 20时,它应该返回6564120420,但它为我返回2269153124。

有人能指出我正确的方向吗?

#include <iostream>

using namespace std;

unsigned long int countTree(unsigned int N)
{
    //used to store catalan numbers
    unsigned long int catalan[N+1];

    //N(0)=N(1)=1
    catalan[0]=catalan[1]=1;    
    int i,j;

    for(i=2;i<=N;i++)
    {
        catalan[i]=0;
        for(j=0;j<i;j++)
        {
            catalan[i]+=catalan[j]*catalan[i-j-1];
        }
    }
    return catalan[N];
}

int main()
{
    unsigned int x;
    cout<<"Input N:"<<endl;
    cin>>x;
    unsigned long int result=countTree(x);
    cout<<result<<endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您超过了这些变量类型允许存储的最大大小。

long long类型是您最好的选择。

您可以在此处查看不同类型整数的最大值:http://www.cplusplus.com/reference/climits/

答案 1 :(得分:1)

使用&#34; unsigned long long&#34;代替&#34; unsigned int&#34; .`

#include <iostream>

using namespace std;

unsigned long long countTree(unsigned int N)
{
    //used to store catalan numbers
    unsigned long long catalan[N+1];

    catalan[0]=catalan[1]=1;    
    int i,j;

    for(i=2;i<=N;i++)
    {
        catalan[i]=0;
        for(j=0;j<i;j++)
            catalan[i]+=catalan[j]*catalan[i-j-1];
    }
    return catalan[N];
}

int main()
{
    unsigned int x;
    cout << "Input N:" << endl;
    cin >> x;
    cout << countTree(x) << endl;
    return 0;
}