卡特兰数(35分)
题目内容:
卡塔兰数是组合数学中,解决各种计数问题的常用数列。
卡塔兰数的定义:
⑴ 第 0 项为 1;
⑵ 第 1 项为 1;
⑶ 第 n 项的计算公式
Cn = C0*Cn-1 + C1*Cn-2 + C2*Cn-3 + ... + Cn-1*C0
卡特兰数是从第0项开始,其前10项为:
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862
问题:编写函数CTL,计算并输出卡特兰数的前 n 项(n>=3),项与项之间用一个英文空格分隔(注:第1项的左边和最末1项的右边不得有英文空格);
提示:
1、随着项数 n 的增加,卡特兰数会急剧增加,请适当地考虑长整型。
2、根据 n 的大小,在 CTL 函数中动态分配内存(注:在返回前,删除所分配的内存)。
代码:(编写函数CTL,完善以下代码)
#include <iostream>
using namespace std;
int main()
{
long *lngCTL=NULL;
int n, i;
cin>>n;
CTL(lngCTL,n);
return 0;
}
输入格式:
卡特兰数的项数 n
输出格式:
卡特兰数的前 n 项,项与项之间用一个英文空格分隔(注:第1项的左边和最末1项的右边不得有英文空格)
输入样例:
10
输出样例:
1 1 2 5 14 42 132 429 1430 4862
题目让用动态数组,还给了部分代码,让返回前释放内存。
不过说实话我不是很理解命题者意图,动态数组我感觉不是很有必要,甚至题目给出的代码里面地空指针lngCTL我也没有用上。
反正是没看明白,索性抱着一个能过就行的心态去做。
代码1如下:
#include <iostream>
using namespace std;
long Catalan(int x)
{
long sum=0;
if(x==0||x==1)
{
return 1;
}
else
{
for(int i=0;i<x;i++)
sum+=Catalan(i)*Catalan(x-1-i);
return sum;
}
}
void CTL(long *x, int y)
{
if(y<=2)
return;
cout<<Catalan(0);
for(int i=1;i<y;i++)
{
cout<<" "<<Catalan(i);
}
cout<<endl;
}
int main()
{
long *lngCTL=NULL;
int n, i;
cin>>n;
CTL(lngCTL,n);
return 0;
}
老师公布了答案,原来是思路非常不一样,我用的是函数的递归调用,但是老师是把每一个项都存到动态数组里面,然后第n项向前用公式求得。
代码2如下:
#include <iostream>
using namespace std;
void CTL(long*x,int y);
int main()
{
long *lngCTL=NULL;
int n, i;
cin>>n;
lngCTL=new long[n+1];
CTL(lngCTL,n);
delete lngCTL;
return 0;
}
void CTL(long*x,int y)
{
if(y<=1)
return;
x[0]=x[1]=1;
for(int i=2;i<=y;i++)
{
x[i]=0;
for(int j=0;j<i;j++)
x[i]+=x[j]*x[i-j-1];
}
int k;
cout<<x[0];
for(k=1;k<=y-1;k++)
{
cout<<" "<<x[k];
}
cout<<endl;
}