´問題描述:
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;
}
#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;
}