题目是说给出一个数字,然后以1到这个数为序号当做二叉树的结点,问总共有几种组成二叉树的方式。这个题就是用卡特兰数算出个数,然后因为有编号,不同的编号对应不同的方式,所以结果是卡特兰数乘这个数的阶乘种方案。因为数字比较大,所以要用高精度的方法也就是用字符数组来做,我分别写了三个函数,一个算加法,一个算乘法,最后一个打表,等打出表来最后只要判断一下输入的数是第几个,直接输出就行了,下面是我的代码,第一次写高精度的这种大数处理,可能看上去比较繁琐= =

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. char ans[][];
  7. char ads[],mus[];
  8. char jc[][];
  9. char res[][];
  10.  
  11. int multiply(char* a1,char* b1)
  12. {
  13. memset(mus,,sizeof(mus));
  14. int i,j,k;
  15. int len,len1,len2;
  16. len1=strlen(a1);
  17. len2=strlen(b1);
  18. int mut=,t;
  19. bool va[];
  20. int s[],adt[];
  21. char a[],b[];
  22. memset(s,,sizeof(s));
  23. memset(adt,,sizeof(adt));
  24. memset(va,,sizeof(va));
  25. for(i=len1-,j=;i>=;i--)
  26. {
  27. a[i]=a1[j];
  28. j++;
  29. }
  30. for(i=len2-,j=;i>=;i--)
  31. {
  32. b[i]=b1[j];
  33. j++;
  34. }
  35. for(i=;i<len1;i++)
  36. {
  37. mut=;
  38. for(j=;j<len2;j++)
  39. {
  40. t=(a[i]-'')*(b[j]-'')+mut;
  41. mut=;
  42. if(t>=)
  43. {
  44. mut=t/;
  45. t=t%;
  46. }
  47. s[i+j]=t+s[i+j]+adt[i+j];
  48. va[i+j]=;
  49. adt[i+j]=;
  50. if(s[i+j]>=)
  51. {
  52. if(!va[i+j+])
  53. adt[i+j+]=s[i+j]/+adt[i+j+];
  54. else
  55. adt[i+j+]=s[i+j]/;
  56. s[i+j]=s[i+j]%;
  57. }
  58. }
  59. s[i+j]=mut;
  60. }
  61. s[i+j-]=mut+adt[i+j-];
  62. if(s[i+j-]!=)
  63. k=i+j-;
  64. else
  65. k=i+j-;
  66. for(i=k,j=;i>=;i--)
  67. {
  68. mus[i]=(s[j]+'');
  69. j++;
  70. }
  71. return ;
  72. }
  73.  
  74. int additive(char* a,char* b)
  75. {
  76. memset(ads,,sizeof(ads));
  77. int len,len1,len2;
  78. int i;
  79. int ad[];
  80. len1=strlen(a);
  81. len2=strlen(b);
  82. if(len1==len2)
  83. {
  84. len=len1;
  85. }
  86. else if(len1>len2)
  87. {
  88. len=len1;
  89. for(i=len;i>=len-len2;i--)
  90. {
  91. b[i]=b[i-len+len2];
  92. }
  93. for(i=len-len2-;i>=;i--)
  94. {
  95. b[i]='';
  96. }
  97. }
  98. else if(len1<len2)
  99. {
  100. len=len2;
  101. for(i=len;i>=len-len1;i--)
  102. {
  103. a[i]=a[i-len+len1];
  104. }
  105. for(i=len-len1-;i>=;i--)
  106. {
  107. a[i]='';
  108. }
  109. }
  110. int t=;
  111. for(i=len-;i>=;i--)
  112. {
  113. ad[i]=(a[i]-'')+(b[i]-'')+t;
  114. t=;
  115. if(ad[i]>=)
  116. {
  117. t++;
  118. ad[i]=ad[i]-;
  119. ads[i]=ad[i]+'';
  120. }
  121. else
  122. {
  123. ads[i]=ad[i]+'';
  124. }
  125. }
  126. if(t==)
  127. {
  128. for(i=len;i>=;i--)
  129. {
  130. ads[i]=ads[i-];
  131. }
  132. ads[]='';
  133. }
  134. return ;
  135. }
  136.  
  137. int excel()
  138. {
  139. ans[][]='';
  140. ans[][]='';
  141. char sum[];
  142. int n;
  143. int i,j;
  144. char t[];
  145. memset(sum,,sizeof(sum));
  146. for(i=;i<=;i++)
  147. {
  148. for(j=i;j>;j--)
  149. {
  150. multiply(ans[i-j],ans[j-]);
  151. additive(mus,sum);
  152. strcpy(sum,ads);
  153. }
  154. strcpy(ans[i],sum);
  155. memset(sum,,sizeof(sum));
  156. }
  157. jc[][]='';
  158. for(i=;i<;i++)
  159. {
  160. memset(t,,sizeof(t));
  161. if(i>=)
  162. {
  163. t[]=i/+'';
  164. t[]=i%+'';
  165. }
  166. else
  167. {
  168. t[]=i+'';
  169. }
  170. multiply(jc[i-],t);
  171. strcpy(jc[i],mus);
  172. }
  173. multiply(jc[],"");
  174. strcpy(jc[],mus);
  175. for(i=;i<=;i++)
  176. {
  177. multiply(ans[i],jc[i]);
  178. strcpy(res[i],mus);
  179. //cout<<"res["<<i<<"]="<<res[i]<<endl;
  180. }
  181. return ;
  182. }
  183.  
  184. int main()
  185. {
  186. int n;
  187. excel();
  188. while(scanf("%d",&n)!=EOF)
  189. {
  190. if(n==)
  191. break;
  192. cout<<res[n]<<endl;
  193. }
  194. return ;
  195. }

HDU 1131 Count the Trees 大数计算的更多相关文章

  1. Uva 10007 / HDU 1131 - Count the Trees (卡特兰数)

     Count the Trees  Another common social inability is known as ACM (Abnormally Compulsive Meditation) ...

  2. HDU 1131 Count the Trees

    卡特兰数再乘上n的阶乘 #include<iostream> #include<cstdio> using namespace std; #define base 10000 ...

  3. hdu 1130,hdu 1131(卡特兰数,大数)

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. zjuoj 3602 Count the Trees

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 Count the Trees Time Limit: 2 Seco ...

  5. Count the Trees[HDU1131]

    Count the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. hdu 1023 卡特兰数《 大数》java

    Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. js 大数计算

    js 大数计算 原理 JavaScript 安全整数 是 -253-1 ~ 253-1 ,即: -9007199254740991 ~ 9007199254740991; 换句话说,整数超过这个范围就 ...

  8. HDU 4588 Count The Carries 计算二进制进位总数

    点击打开链接 Count The Carries Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  9. HDU 1042 大数计算

    这道题一开始就采用将一万个解的表打好的话,虽然时间效率比较高,但是内存占用太大,就MLE 这里写好大数后,每次输入一个n,然后再老老实实一个个求阶层就好 java代码: /** * @(#)Main. ...

随机推荐

  1. 模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书)

    模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书) [美]Sutton, M.Greene, A.Amini, P. 著 段念赵勇译 ISBN 978-7-121-21083-9 2013年 ...

  2. MySQL(三) 数据库表的查询操作【重要】

    序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VARCHAR.BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对 ...

  3. python socket 学习

    Python在网络通讯方面功能强大,今天学习一下Socket通讯的基本方式,分别是UDP通讯和TCP通讯. UDP通讯 upd 服务端 #!/usr/bin/env python # -*- codi ...

  4. 【WP开发】在手机屏幕点亮时播放声音

    今天说的内容有点流氓,请诸君在开发应用时谨慎使用. 那么,这活儿到底有多流氓呢? 先介绍一下要实现的功能:当用户按电源键(也可以是双击屏幕)点亮手机的屏幕时播放一下短音乐,而且应用程序可以不在前台运行 ...

  5. 关于pt与px

    pt:point,点,是印刷业一个标准的长度单位,1pt=1/72英寸:  在Windows里,默认的显示设置中,把文字定义为96dpi.这说明了:1px=1/96英寸:而1pt=1/72英寸,可以得 ...

  6. selenium-webdriver(python) (十四) -- webdriver原理

    之前看乙醇视频中提到,selenium 的ruby 实现有一个小后门,在代码中加上$DEBUG=1 ,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据:觉得这个功能很强大,可以帮助理 ...

  7. 搭建PHP开发环境

    通过两种方式搭建PHP开发环境,而这种开发环境实际是:Apache+MySQL+PHP.  第一种: 通过套件来安装和配置php开发环境. Apache+MySQL+PHP开发环境的搭建(一) 第二种 ...

  8. JAVA 设计模式 外观模式

    用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构

  9. 歌词文件解析(一):LRC格式文件的解析

    LRC是英文lyric(歌词)的缩写,被用做歌词文件的扩展名.以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示.LRC 歌词是一种包含着“*:*”形式的“标签(tag)”的基于纯文本的歌词专用 ...

  10. a configuration error occurred during startup. place verify the preference field whth the prompt:TomcatJDK name:

    错误一:安装Tomcat的时候出现了错误,这里要是找不到Tomcat6.0我们可以设置其enbale显示就可以,上面的错误解决办法: 错误二:在eclipse中启动Tomcat6.0的时候现在说800 ...