#include<stdio.h>
#include<math.h>
int a[105][105]; //大数卡特兰数
int b[105]; //卡特兰数的长度
void catelan()
{
int len,temp,c,i,j;
a[1][0]=b[1]=1;
len=1;
for(i=2; i<=100; i++)
{
for(j=0; j<len; j++) //乘法
a[i][j]=a[i-1][j]*(4*(i-1)+2);
c=0;
for(j=0; j<len; j++) //处理相乘结果
{
temp=a[i][j]+c;
a[i][j]=temp % 10;
c = temp / 10;
}
while(c) //进位处理
{
a[i][len++] = c % 10;
c /= 10;
}
c=0;
for(j=len-1; j>=0; j--) //除法
{
temp=c*10+a[i][j];
a[i][j]=temp/(i+1);
c=temp%(i+1);
}
while(!a[i][len-1]) //高位零处理
len--;
b[i]=len;
}
}
int main()
{
int n;
catelan();
while(~scanf("%d",&n))
{
for(int i=b[n]-1; i>=0; i--)
printf("%d",a[n][i]);
printf("\n");
}
return 0;
}
对于大数卡特兰数,百度百科直接就有样例程序,照样子复制粘贴直接搞定。
如果,你足够耐心,想另类点,你也可以打表:
可以去戳这个网站,里面有1到100的卡特兰数http://blog.csdn.net/lttree/article/details/29392541
小伙伴们,是不是惊呆了?!
我的做法就是用之前大数乘法的理念,每个数组存5位数。
这样做有几点要注意:
1.先乘起来,存到数组,再除。
2.除的时候,要将前一位的余数*相应位数(我存5位,所以乘以 100000 ) 加上当前数组内容再算除法。
3.最后要看高位是否为0
4.最后输出的时候,还要补0,就比如第12个卡特兰数 208012,存在数组肯定是 8012,2
如果输出的时候没有补0,则会输出28012,显然是错误的。这个可以用填充来解决,C语言的printf比较简便。
恩,这道题,卡了一段时间,关键是忘了先算乘最后算除。
As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway.
1 2 3 10
1 2 5 16796