回 帖 发 新 帖 刷新版面

主题:用高精度实现整数+—×/,并计算catalan数和大组合数4

接3
int compare_cata(const cata &x,const cata &y)         //x>y return 1;x<y return 0;x==y return 2;
{
    int len_x=x.length(),len_y=y.length();
    int displace=y.displacement;
    if(len_x>len_y)
    {
        return 1;
    }
    else if(len_x<len_y)
    {
        return 0;
    }
    
    else
    {
        for(int i=len_x-1;i>=0;i--)
        {
            if(x.data[i]!=y.data[i+displace])
            {
                break;
            }
        }
        if(-1==i)
        {
            return 2;
        }
        else
        {
            if(x.data[i]>y.data[i+displace])
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
    }
}///:p

void result(cata &m,cata &n,cata &result_combination,cata &result_catalan)           //出结果函数
{
    int cp;
    cata temp_1(1),temp_2(1),temp_1_1;
    temp_1.data[0]=1,temp_2.data[0]=2;
    temp_1.n=1,temp_2.n=1;
    temp_1_1=temp_1;
    cata combination_m,combination_n,temp_n,catalan_m,temp_finish;
    catalan_m=combination_m=m;

    if((cp=compare_cata(m/temp_2,n))==0)
    {
        m=combination_m;
        n=m-n;
        combination_n=n;    
        m=combination_m;
    }

    else
    {
        m=combination_m;
        combination_n=n;
    }
    int cp_boundary=cp;
    temp_finish=m-n+temp_1;
    temp_n=temp_1;
    temp_n+n;

    m=combination_m;
    while((cp=compare_cata(combination_m,temp_finish))==1)
    {
        combination_m-temp_1;
        m*combination_m;
    }
                                                     
    while((cp=compare_cata(combination_n,temp_1))==1)
    {
        combination_n-temp_1;
        n*combination_n;
    }
   
    cata catalan_div;
    if(cp_boundary!=2)
    {
        catalan_div=temp_finish-temp_1;                             //catalan_div存放这catalan的除数
        while((cp=compare_cata(temp_finish,temp_n))==1)
        {
            temp_finish-temp_1;
            catalan_div*temp_finish;
        }
        catalan_div*m*n;                                            //为提高效率,尽量用到了已知的m,n来算catalan_div,即m!
    }
    else
    {
        catalan_div=temp_1;
        catalan_div*m*n;
    }
    result_combination=m/n;

    temp_1+catalan_m+temp_1_1;
    m=catalan_m*temp_2;
    while((cp=compare_cata(catalan_m,temp_1))==1)
    {
        catalan_m-temp_1_1;
        m*catalan_m;
    }
    result_catalan=m/catalan_div;
}///:p

void boundary_result(cata &m,cata &result_combination,cata &result_catalan)
{
    int cp;
    cata temp_1(1),temp_2(1),temp_1_1,catalan_m,catalan_div;
    temp_1.data[0]=1,temp_2.data[0]=2;
    temp_1.n=1,temp_2.n=1;
    result_combination=temp_1;
    temp_1_1=temp_1;
    catalan_div=catalan_m=m;

    temp_1+catalan_m+temp_1_1;
    m=catalan_m*temp_2;
    while((cp=compare_cata(catalan_m,temp_1))==1)
    {
        catalan_m-temp_1_1;
        m*catalan_m;
    }

    catalan_m=catalan_div;
    while((cp=compare_cata(catalan_m,temp_1_1))==1)
    {
        catalan_m-temp_1_1;
        catalan_div*catalan_m;
    }

    result_catalan=m/catalan_div;
}///:p

inline void cata::printcata(ofstream &out) const
{
    for(int i=n-1;i>=0;i--)
    {
        out<<data[i];
    }
    out<<endl;
}

回复列表 (共1个回复)

沙发

如果分页看觉的麻烦,可以到我的BLOG

我来回复

您尚未登录,请登录后再回复。点此登录或注册