前几个卡特兰数:规定C0=1,而
C1=1, C2=2, C3=5, C4=14, C5=42,
C6=132, C7=429, C8=1430, C9=4862, C10=16796,
C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845。
求卡特兰数的公式有一下几个:
/* 大数解 对于大数来说,就应该使用下面的大数算法。 使用的公式为:h(n) = h(n-1)*(4*n-2)/(n+1); */ // 0ms #include<iostream> #include<cstring> #include<stdio.h> using namespace std; #define MAX 100 //能计算的最大值10000^100,最大为400位 #define BASE 10000 void multiply(int a[],int Max,int b) //大数乘法,注意参数的传递 { int i,array=0; for (i = Max-1; i >= 0; i--) { array += b * a[i]; a[i] = array % BASE; // 数组每一位存放大数的四位数字 array /= BASE; } } void divide(int a[], int Max, int b) //模拟大数除法 { int i, div = 0; for (i = 0; i < Max; i++) { div = div * BASE + a[i]; a[i] = div / b; div %= b; } } int main() { int a[101][MAX],i, n; memset(a[1],0,MAX*sizeof(int)); for (i=2, a[1][MAX-1] = 1; i < 101; i++) // 高坐标存放大数低位 { memcpy(a[i], a[i-1], MAX * sizeof(int)); //h[i] = h[i-1]; multiply(a[i], MAX, 4 * i - 2); //h[i] *= (4*i-2); divide(a[i], MAX, i + 1); //h[i] /= (i+1); } while (cin >> n) { for (i = 0; i < MAX && a[n][i] == 0; i++); //去掉数组前为0的数字。 cout << a[n][i++]; //输出第一个非0数 for (; i < MAX; i++) { printf("%04d",a[n][i]); //输出后面的数,并每位都保持4位长度!(32767) } cout << endl; } return 0; }
原文地址:http://blog.csdn.net/u010468553/article/details/38986889