博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1023 Train Problem II 大数打表Catalan数
阅读量:5924 次
发布时间:2019-06-19

本文共 1075 字,大约阅读时间需要 3 分钟。

一个出栈有多少种顺序的问题。一般都知道是Catalan数了。

问题是这个Catalan数非常大,故此须要使用高精度计算。

并且打表会速度快非常多。打表公式要熟记:

Catalan数公式 Cn=C(2n,n) / (n+1);

递推公式 C(n ) = C(n-1)*(4*n-2) / (n+1)

高精度乘以一个整数和高精度除以一个整数的知识。这样还是使用整数数组比較好计算,假设使用string那么就不太好计算了,由于整数也可能是多位的。

const int MAX_N = 101;short catalan[MAX_N][MAX_N];//catlans[i][0] save the lengthvoid calCatalans(){	short carry = 0, len = 1;	catalan[1][0] = 1; catalan[1][1] = 1;	catalan[2][0] = 1; catalan[2][1] = 2;	for (int i = 3; i < MAX_N; i++)	{		carry = 0;		for (int j = 1; j <= len; j++)//高精度乘以一个整数		{			short sum = catalan[i-1][j]*((i<<2)-2) + carry;			carry = sum / 10;			catalan[i][j] = sum % 10;		}		while (carry)		{			catalan[i][++len] = carry % 10;			carry /= 10;		}		for (int j = len; j > 0; j--)//高精度除以一个整数		{			short sum = catalan[i][j] + carry*10;			catalan[i][j] = sum / (i+1);			carry = sum % (i+1);//一定能除尽。故此无需考虑余数情况		}		while (catalan[i][len] == 0) len--;		catalan[i][0] = len;	}}int main(){	calCatalans();	int n;	while (~scanf("%d", &n))	{		for (int i = catalan[n][0]; i > 0; i--)		{			printf("%d", catalan[n][i]);		}		putchar('\n');	}	return 0;}

转载地址:http://fuavx.baihongyu.com/

你可能感兴趣的文章
MyEclipse 中配置struts2.2.1的方法
查看>>
工作笔记-RTX软件用友OA冲突解决
查看>>
数据库设计中一个矛盾:数据库外键 你用还是不用(2) 继续....
查看>>
直播源码部署直播软件系统搭建!
查看>>
MDaemon升级用户数之后 仍然无法创建新账号
查看>>
Hibernate4.0之HibernateSessionFactory源码详解
查看>>
Windows NT 内核基本结构
查看>>
DataGrid与SQL Server 2000数据绑定
查看>>
linux 搭建ftp服务器
查看>>
Jenkins的持续集成及自动化部署在测试和生产环境中的运用系列
查看>>
Microsoft uaa bus driver for high definition audio
查看>>
Spring(26)——PathMatchingResourcePatternResolver
查看>>
耦合_wiki
查看>>
JavaScript -- 条件语句
查看>>
Juniper 5GT透明模式配置
查看>>
使用Swift去掉字符串中的空格
查看>>
系出名门Android(10) - HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理
查看>>
cisco password7方式的密码破解程序
查看>>
XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言)
查看>>
温故知新ASP.NET 2.0(C#)(5) - Localization(本地化,多语言)
查看>>