您的位置:首页 > 其它

HDOJ1023(卡特兰数+大数乘除法)

2017-09-25 19:10 316 查看
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <stack>

using namespace std;

#define N 110
int a

;

//a
[0] 用于当长度是n时的组合数

void ktl()
{
int i, j, l = 1, c, s;
a[1][0] = 1;
a[1][1] = 1;
a[2][0] = 1;
a[2][1] = 2;
for (i = 3; i < 101; i++) //预打表
{
c = 0;
for (j = 1; j <= l; j++)  //(乘法)
{
s = a[i - 1][j] * (4 * i - 2) + c;//example: 11*4=10*4+1*4, c是上一位的进位
a[i][j] = s % 10;
c = s / 10;
}
while (c) //(乘法进位处理)
{
a[i][++l] = c % 10;
c /= 10;
}
for (int j = l; j > 0; j--)  //(除法)
{
s = a[i][j] + c * 10;  //example:99/10 9除不尽10 作余数留到下一位 使得下一位是99 可以除得尽10
a[i][j] = s / (i + 1);
c = s % (i + 1);
}
while (!a[i][l]) l--;
a[i][0] = l;  //储存长度
}
}

int main()
{
ktl();
int n;
while (cin >> n)
{
for (int i = a
[0]; i > 0; i--) cout << a
[i];
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: