标准2 维表问题
´问题描述:
n 是一个正整数。2n 的标准2 维表是由正整数 1,2 ,…,2n 组成的2n 数组,该
数组的每行从左到右递增,每列从上到下递增。2n 的标准2 维表全体记为Tab(n) 。例如,
当n=3 时Tab(3)如下:
1 2 3 1 2 4 1 2 5 1 3 4 1 3 5
4 5 6 3 5 6 3 4 6 2 5 6 2 4 6
´编程任务:
给定正整数n,计算Tab(n) 中2n 的标准2 维表的个数。
´数据输入:
给出输入数据。第一行有1 个正整数n 。
´结果输出:
将计算出的Tab(n) 中2n 的标准2 维表的个数输出到文件output.txt 。
输入示例 输出示例 3 5 此问题是求Catalan数问题 代码如下: //此题的答案其实就是Catalan数,因为数字很大所以关键是要用到大数相乘的方法
#include<stdio.h>
int a[101][101] = {0};
int main()
{
int n,i,j,len,r,temp,t;
int b[101];
a[1][0] = 1; // 低座标存放大数的低位
len = 1;
b[1] = 1;
for (i = 2; i <= 100; i++)
{
t = i – 1;
for (j=0;j<len;j++) // 模拟乘法,从低位开始
{
a[i][j] = a[i-1][j] * (4 * t + 2);
}
for (r = j = 0; j < len; j++) // 处理相乘结果
{
temp = a[i][j] + r;
a[i][j] = temp % 10;
r = temp / 10;
}
while (r) // 进位处理
{
a[i][len++] = r % 10;
r /= 10;
}
for (j = len-1, r = 0; j >= 0; j–) // 模拟除法,从高位开始
{
temp = r * 10 + a[i][j];
a[i][j] = temp / (t+2);
r = temp % (t+2);
}
while (!a[i][len-1]) // 高位零处理
{
len–;
}
b[i] = len; // 记录结果的长度
}
while (scanf(“%d”,&n))
{
for(j = b[n] – 1; j >= 0; j–)
{
printf(“%d”,a[n][j]);
}
printf(“\n”);
}
return 0;
}