卡特兰数(catalan),也就是“在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?” 源代码(大数运算函数略): /*Game of Connections Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5347 Accepted: 2765 Description This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, . . . , 2n - 1, 2n consecutively in clockwise order on the ground to form a circle, and then, to draw some straight line segments to connect them into number pairs. Every number must be connected to exactly one another. And, no two segments are allowed to intersect. It's still a simple game, isn't it? But after you've written down the 2n numbers, can you tell me in how many different ways can you connect the numbers into pairs? Life is harder, right? Input Each line of the input file will be a single positive number n, except the last line, which is a number -1. You may assume that 1 <= n <= 100. Output For each n, print in a single line the number of ways to connect the 2n numbers into pairs. Sample Input 2 3 -1 Sample Output 2 5 */ #include "stdlib.h" #include "stdio.h" #define MAX_BIGINT_LEN 1000 int gaiResult[MAX_BIGINT_LEN]; extern int bigmult(int a[],unsigned int b,int c[]);//高精度乘以低精度 extern int bigdiv(int a[],unsigned int b,int c[],int *d); /* 令h(1)=1,h(0)=1, catalan数满足递归式: h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2) 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); 该递推关系的解为: h(n)=C(2n,n)/(n+1) (n=1,2,3,...)*/ void CalculateCatalan(int viN) { int aiMultResult[MAX_BIGINT_LEN]; int iRemainder = 0; if (1 == viN ) { gaiResult[0] = 1; gaiResult[1] = 1; return; } CalculateCatalan(viN - 1); bigmult(gaiResult,(4*viN - 2),aiMultResult); bigdiv(aiMultResult,(viN + 1),gaiResult,&iRemainder); return ; } void main()/*GameOfConnections*/ { int iInputN; int iLoop = 0; while (1) { scanf("%d",&iInputN); if (0 >= iInputN ) { return; } memset(gaiResult,0,MAX_BIGINT_LEN*sizeof(int)); CalculateCatalan(iInputN); for (iLoop = gaiResult[0]; iLoop > 0; iLoop--) { printf("%d",gaiResult[iLoop]); } printf("/n"); } return; }