12.03周日

来源:互联网 发布:分布式数据库的安全性 编辑:程序博客网 时间:2024/05/18 00:52

  昨天做了几个卡特兰数的题目,之前做ACM steps的时候就做过,当时一知半解的,现在系统地看了相关的知识。数据小的问题还可以,但是涉及高精度处理的,我还是很吃力,写代码也是不顺,改错时只能对着题解来找错,所以之后还要多研读。


令h(0)=1,h(1)=1,catalan数满足递推式  :
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
另类递推式 :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

实质上是递推式的应用。


代码模板

void catalan() 
{
    int i, j, len, carry, temp;
    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);
        carry = 0;
        for(j = 0; j < len; j++) //处理相乘结果
        {
            temp = a[i][j] + carry;
            a[i][j] = temp % 10;
            carry = temp / 10;
        }
        while(carry) //进位处理
        {
            a[i][len++] = carry % 10;
            carry /= 10;
        }
        carry = 0;
        for(j = len-1; j >= 0; j--) //除法
        {
            temp = carry*10 + a[i][j];
            a[i][j] = temp/(i+1);
            carry = temp%(i+1);
        }
        while(!a[i][len-1]) //高位零处理
        len --;
        b[i] = len;
    }
}


参考资料:

http://blog.163.com/lz_666888/blog/static/1147857262009914112922803/

http://www.cnblogs.com/buptLizer/archive/2011/10/23/2222027.html

http://www.cppblog.com/MiYu/archive/2010/08/07/122573.html



原创粉丝点击