卡特兰数的模拟。
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, 0, sizeof(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;
#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, 0, sizeof(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;
}