Catalan数的解法
来源:互联网 发布:linux就该这么学电子书 编辑:程序博客网 时间:2024/04/30 03:33
Catalan数的组合公式为 Cn=C(2n,n) / (n+1);
此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)
小数解对于50以下的小数解来说,使用数组就可以完成,代码如下:
#include<iostream>
using namespace std;
int main()
{
long long int a[101][101],i,j,n;
for (i=0; i<101; i++) //利用数组求 Catalan数
a[i][0] = 1;
for (i=1; i<101; i++)
{
for (j=1; j<=i; j++)
a[i][j] = a[i][j-1] + a[i-1][j];
}
while (cin>>n)
{
cout<<a[n][n]<<endl;
}
return 0;
}
大数解对于大数来说,就应该使用下面的大数算法。
使用的公式为:h(n) = h(n-1)*(4*n-2)/n+1;
#include<iostream>
using namespace std;
#define MAX 100
#define BASE 10000
void multiply(int a[],int Max,int b) //大数乘法
{
int i,array=0;
for (i=Max-1; i>=0; i--)
{
array+=b*a[i];
a[i] = array%BASE;
array /= BASE;
}
}
void divide(int a[], int Max, int b) //大数除法
{
int i,div=0;
for (i=0;i<Max; i++)
{
div = div*BASE + a[i];
a[i] = div / b;
div %= b;
}
}
int main()
{
int a[101][MAX],i,j,n;
memset(a[1],0,MAX*sizeof(int));
for (i=2,a[1][MAX-1]=1; i<101; i++)
{
memcpy(a[i],a[i-1],MAX*sizeof(int)); //h[I] = h[i-1];
multiply(a[i],MAX,4*i-2); //h[i] *= (4*i-2);
divide(a[i],MAX,i+1); //h[i] /= (i+1);
}
while (cin>>n)
{
for (i=0; i<MAX && a[n][i]==0; i++); //去掉数组前为0的数字。
cout<<a[n][i++]; //输出第一个非0数
for (; i<MAX; i++)
printf("%04d",a[n][i]); //输出后面的数,并每位都保持5位长度
cout<<endl;
}
return 0;
}
- Catalan数的解法
- Catalan 数的应用
- 神奇的catalan数
- 神奇的Catalan数
- Catalan数的理解
- Catalan数的一些应用
- Catalan数的应用场景
- 1-100的Catalan数
- Catalan数的一些结论
- Catalan数
- Catalan数
- Catalan数
- catalan数
- catalan数
- Catalan数
- Catalan数
- Catalan数
- Catalan数
- Java 正则表达式应用一例
- 《渗透测试实践指南》读书笔记之后门和rootkit
- ubuntu eclipse代码编辑去
- ucGUI 消息驱动机制结构和使用
- APNS推送通知的流程
- Catalan数的解法
- 使lightbox2 的弹出的大图片自动适应屏幕大小
- 查看无root权限Android手机的app数据库
- tinyxml使用指导
- MySQL中的内置系统函数
- JPA注解
- ubuntu 用户、用户组设置
- 目标检测中背景建模方法
- ubuntu关闭防火墙