卡特兰数裸题,代码主要部分就是写高精度了
高精度模板:bign类C++高精度模板
这里因为位数不多所以没有压位
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct Big
{
int num[10000],len;
void zero()
{
while (num[len]==0 && len>1) len--;
}
Big()
{
memset(num,0,sizeof(num));
len=0;
}
Big operator = (int a)
{
memset(num,0,sizeof(num));
while (a>0)
{
num[++len]=a%10;
a/=10;
}
zero();
return *this;
}
Big operator + (const Big &a)
{
Big c; c.len=max(len,a.len)+1;
for (int i=1;i<=c.len;i++)
{
c.num[i]+=num[i]+a.num[i];
}
for (int i=1;i<=c.len;i++)
{
c.num[i+1]+=c.num[i]/10;
c.num[i]%=10;
}
c.zero();
return c;
}
Big operator * (const Big &a)
{
Big c; c.len=len+a.len;
for (int i=1;i<=len;i++)
{
for (int j=1;j<=a.len;j++)
{
c.num[i+j-1]+=num[i]*a.num[j];
}
}
for (int i=1;i<=c.len;i++)
{
c.num[i+1]+=c.num[i]/10;
c.num[i]%=10;
}
c.zero();
return c;
}
void Print()
{
for (int i=len;i>=1;i--) printf("%d",num[i]);
}
};
int n,tt;
Big cat[110];
void make_cat()
{
cat[0]=1; cat[1]=1;
for (int i=2;i<=100;i++)
{
Big sum;
for (int j=0;j<i;j++)
{
int k=i-j-1;
sum=sum+cat[j]*cat[k];
}
cat[i]=sum;
}
}
int main()
{
make_cat();
while (scanf("%d",&n)!=-1)
{
cat[n].Print(); printf("\n");
}
return 0;
}