Train Problem II

组合数学问题,结果是catalan数,公式见http://www.iwebtrados.com.cn/post/213.html
唯一要注意的问题是n比较大,需要用大数来处理。为了避免做大数除法,先做了一个小处理。
#include <stdio.h>
#include <stdlib.h>
int gcd1(int a,int b)
{
         int t;
         if(a<b) {t=a;a=b;b=t;}
         while(b)
         {
                 t=b;
                 b=a%b;
                 a=t;
         }
         return a;
}
void go(int n,int m)
{
    int a[1000],b[1000],i,j,k,t,l,s,c;
        for(i=0;i<m;i++)
        {
              a[i]=n-i;
        }
        for(i=1;i<=m;i++)
        {
              k=i+1;
              for(j=0;j<m;j++)
              {                 
                  t=gcd1(a[j],k);
                  if(t>1) {a[j]/=t;k/=t;}
              }
        }
        l=b[0]=1;
        for(i=0;i<m;i++)
        {
             for(c=j=0;j<l;j++)
             {
                 s=b[j]*a[i]+c;
                 b[j]=s%10000;
                 c=s/10000;
                               
             }
             if(c) {
                       while(c)
                       {
                              b[l++]=c%10000;
                              c/=10000;      
                       }
                   }
        }   
        printf("%d",b[l-1]);
        for(i=l-2;i>=0;i--)
             printf("%04d",b[i]);
        printf("\n");
}
int main()
{
   
    int n;
    while(scanf("%d",&n)!=EOF)
    {
         go(2*n,n);                      
    }
    system("pause");
    return 0;
}
本文来源于网络小筑 http://www.iwebtrados.com.cn/ , 原文地址:http://www.iwebtrados.com.cn/post/224.html


 

 


 

posted on 2009-10-09 15:27  网络小筑  阅读(306)  评论(0编辑  收藏  举报

导航