卡特兰大数详解

卡特兰大数详解

今天膜你赛出了个卡特兰大数,写正常卡特兰数只能得部分分(然而我忘了卡特兰数怎么写,所以爆零了
在这里插入图片描述正常卡特兰数:

#include <cstdio>
#include <cmath>
long long h[35];
int main() {
	h[0] = h[1] = 1;
	int n;
	scanf("%d", &n);
	for (int i = 2; i <= n; i++) {
		h[i] = h[i - 1] * (4 * i - 2) / (i + 1);//递推
	}
	printf("%lld", h[n]);//注意占位符,输出
	return 0;
} 

高精卡特兰数:

#include<bits/stdc++.h>
using namespace std;
#define LEN 500
typedef struct
{
	int len;
	char val[LEN+5];
}HD;
HD add(HD a,HD b) 
{
	int i;
	HD ret=(HD){0,""};
	for(i=1;i<=a.len||i<=b.len;i++) 
	{
		ret.val[i]+=a.val[i]+b.val[i];
		ret.val[i+1]=ret.val[i]/10;
		ret.val[i]%=10;
	}
	ret.len=i;
	if(!ret.val[i])
		ret.len--;
	return ret;
}
void print(HD a) 
{
	while(a.len--)
		putchar(a.val[a.len+1] + '0');
}
#define N 1000
HD catalan[N+5];
int main() 
{
	int i,j,n;
	scanf("%d",&n);
	for(i=1;i<=n;i++) 
	{
		catalan[i].len=1;
		catalan[i].val[1]=1;
	}
	for(i=1;i<=n;i++) 
	{
		for(j=i+1;j<=n;j++)
			catalan[j]=add(catalan[j-1],catalan[j]);
	}
	print(catalan[n]);
	return 0;
}

至于这道题为什么是卡特兰数,相信你草算纸用的足够多就能发现!

猜你喜欢

转载自blog.csdn.net/weixin_50624971/article/details/115142093