Hdu 1029 Ignatius and the Princess IV

卡特兰数的模拟。

CODE:

#include <stdio.h>
#include <stdlib.h>
#include < string.h>
#include <math.h>
using  namespace std;

#define MAX 101
#define BASE 10000
int a[ 101][MAX];

void multiple( int a[],  int size,  int b)
{
     int i, j;
     int carry =  0;
     for(i = size- 1; i >=  0; i--)
    {
        carry += a[i]*b;
        a[i] = carry%BASE;
        carry = carry/BASE;
    }
     return ;
}

void divide( int a[],  int size,  int b)
{
     int i, j;
     int div =  0;
     for(i =  0; i < size; i++)
    {
        div = div*BASE + a[i];
        a[i] = div/b;
        div = div%b;
    }
     return
}



void init()
{
     int i;
    memset(a,  0sizeof(a));          // 数组高位存放大数低位 
    a[ 1][MAX- 1] =  1;
     for(i =  2; i <  101 ; i++)
    {
        memcpy(a[i], a[i- 1],  sizeof(a[i- 1]));     // h(n) = h(n-1)
        multiple(a[i], MAX,  4*i- 2);               //  h(n) = h(n-1)*(4*n-2)
        divide(a[i], MAX, i+ 1);                      // h(n) = h(n-1)*(4*n-2)/(n+1)
    }
     return ;
}



void output( int n)
{
     int i;
     for(i =  0; a[n][i] ==  0; i++);      // 跳过数组前面的0 
    printf( " %d ", a[n][i++]);            // 输出第一位非0数 
     for(; i < MAX; i++)
    {
        printf( " %04d ", a[n][i]);        // 由于进位是10000,所以每位保持4位长度 
    }
    printf( " \n ");
}

int main()
{
     int n;
    init();
     while(~scanf( " %d ", &n))
    {
        output(n);
    }
     return  0;

} 

你可能感兴趣的:(HDU)