卡特兰大数

来源:互联网 发布:mac页面切换快捷键 编辑:程序博客网 时间:2024/04/28 19:49

卡特兰大数有两种递推公式:

1、h[i]=h[i-1]*(4*i-2)/(i+1);2、h[i]=h[0]*h[i-1]+h[1]*h[i-2]+...+h[i-1]*h[0](下标和恒等于i-1);

C++的写法

#include<iostream>#include<cstring>#include<cstdio>#include<string>#define base 10000#define max 120using namespace std;int catalan[max][max];void big_mul(int *a,int n)     //大数乘法{    int temp=0;    for(int i=0; i<max; i++)    {        temp+=a[i]*n;;        a[i]=temp%base;        temp/=base;    }}void big_div(int *a,int n)      //大数除法{    int temp=0;    for(int i=max-1; i>=0; i--)    {        temp=temp*base+a[i];        a[i]=temp/n;        temp%=n;    }}void set()                             //求卡特兰数{    for(int i=0; i<max; i++)        memset(catalan[i],0,sizeof(int)*max);    catalan[0][0]=1;    catalan[1][0]=1;    for(int i=2; i<max; i++)    {        memcpy(catalan[i],catalan[i-1],sizeof(int)*max);        big_mul(catalan[i],4*i-2);        big_div(catalan[i],i+1);    }}void output(int* a,int n)   //输出{    int i=n-1;    while(a[i]==0) i--;    printf("%d",a[i--]);    while(i>=0) printf("%04d",a[i--]);    printf("\n");}int main(){    set();    int n;    while(~scanf("%d",&n))        output(catalan[n],n);    return 0;}

JAVA的写法

import java.math.BigInteger;import java.util.Scanner;public class Main {    public static BigInteger c[] = new BigInteger[101];    public static void main(String[] args) {        Scanner scan = new Scanner(System.in);        c[0] = BigInteger.ONE;        for (int i = 1; i <= 100; i++) {            BigInteger a = BigInteger.valueOf(4 * i - 2);            BigInteger b = BigInteger.valueOf(i + 1);            c[i] = a.multiply(c[i - 1]).divide(b);        }        while (scan.hasNext()) {            int n = scan.nextInt();            System.out.println(c[n]);        }    }}
0 0
原创粉丝点击