杭电ACM1130——How Many Tree?~~Catalan数
2015-06-17 16:31
267 查看
Catalan数的递推公式为:F(n)= F(n - 1) * (4*n - 2)/ (n + 1);
由于n最大为100;所以需要用数组来存放每一个Catalan数。需要运用大数的运算。
下面的是AC 的代码:
由于n最大为100;所以需要用数组来存放每一个Catalan数。需要运用大数的运算。
下面的是AC 的代码:
# include <stdio.h> struct catalan { int length; int len[100]; }; struct catalan a[101]; int main() { a[0].length = 1; a[0].len[0] = 1; //前4个Catalan数 a[1].length = 1; a[1].len[0] = 1; a[2].length = 1; a[2].len[0] = 2; a[3].length = 1; a[3].len[0] = 5; int i, j, k, num, n, yu, div; for(i = 4; i <= 100; i++) { num = 4 * i - 2; k = 0; yu = 0; div = 0; a[i].length = 0; for(j = 0; j < a[i - 1].length; j++) //根据公式,先乘以4 * i - 2;采用一位一存的方法。 { a[i].len[k] = (a[i - 1].len[j] * num + yu) % 10; yu = (a[i - 1].len[j] * num + yu) / 10; k++; } while(yu) //余数不为0;继续补上 { a[i].len[k] = yu % 10; yu = yu / 10; k++; } a[i].length = k; for(j = a[i].length - 1; j >= 0; j--) //根据公式,除以i + 1,运用的是大数除以一个小数。 { div = div * 10 + a[i].len[j]; a[i].len[j] = div / (i + 1); div = div % (i + 1); } while(!a[i].len[a[i].length]) //去掉前置的0. a[i].length--; a[i].length++; } while(scanf("%d", &n) != EOF) { for(i = a .length - 1; i >= 0; i--) printf("%d", a .len[i]); printf("\n"); } return 0; }
相关文章推荐
- B树、B+树、红黑树、skiplist
- Longest Common Substring
- Android学习笔记——Handler(一)
- GDI+绘制简单图形
- C语言获取汉字拼音首字母
- Android Screen on/off flow
- Volley简单学习使用二——Request
- javascript循环timeout延迟执行
- 应用drools规则引擎做产生式规则不确定性推理
- HttpServletRequest和HttpSession中setAttribute/getAttribute方法究竟是用来干什么的?
- OJ 嘻唰唰:熟悉题型——填空题(删除线性表节点)
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- 关于jnative调用dll的一些心得
- Flume NG源码分析(五)使用ThriftSource通过RPC方式收集日志
- [再寄小读者之数学篇](2015-06-24 积分不等式)
- 《你的灯亮着吗》读书笔记三
- javascript中string转UTF8格式byte数组
- LeetCode | Two Sum
- GRE写作素材汇总
- telerik(kendoUI)常用控件使用