(关于卡特兰数的详细介绍)http://baike.baidu.com/view/2499752.htm
下面有练习的题目:
经过测试,_int64/long long 最大只能表示到33位,超过这个范围就要用大数来表示。。。
有几个重要的公式是要记得的
F(n)=f(n-1)*(4*n-2)/(n+1);
还有 f(n)=C(2n,n)/(n+1);
或者 f(n)=c(2n,n)-c(2n,n+1);
http://acm.hdu.edu.cn/showproblem.php?pid=1023
代码:
1 #include<stdio.h> 2 #define maxn 100 3 int arr[101][maxn+1]={{1},{1},{2}}; 4 //利用f(n)=f(n-1)*(4n-2)/(n+1); 5 int main() 6 { 7 int s, c=0,i,j,k; 8 for(i=3;i<=100;i++) 9 { 10 for(j=0;j<=maxn;j++) //先计算乘法部分 11 { 12 arr[i][j]=arr[i-1][j]*(4*i-2)+c; 13 c=arr[i][j]/10; 14 arr[i][j]%=10; 15 } 16 s=c=0; 17 for(k=maxn;arr[i][k]==0;k--); //计算除法部分 18 for(j=k;j>=0;j--) 19 { 20 s=arr[i][j]+10*c; 21 c=s%(i+1); 22 arr[i][j]=(s-c)/(i+1); 23 } 24 } 25 26 int n; 27 while(scanf("%d",&n)!=EOF) 28 { 29 for(i=maxn;arr[n][i]==0;i--); 30 for(j=i;j>=0;j--) 31 printf("%d",arr[n][j]); 32 puts(""); 33 } 34 return 0; 35 } 36 //后记,由于测试的时候,发现_int64/long long,都wa了,所以果断的用大数来 37 //做了... 38 //f(n)=f(n-1)*(4*n-2)/(n+1)......f(n)=c(2n,n)-c(2n,n+1)... 39 //f(n)=c(2n,n)/(n+1)...卡特兰数..很重要的...再次说明..希望不要嫌啰嗦、 40