高精度问题——Java大数类~系列5——高精度之Catalan数 hdu 1131
高精度问题(5)——高精度之Catalan数
对Catalan数理解的还不深,在这里先做个标记,用Java大数类实现计算Catalan数(增长速度很快),以后再陆续补充关于Catalan数的内容。
顺便说一点感想,一开始写Java觉得各种函数分得好细,函数名好容易用错啊。写熟了以后再去看,就觉得这样的命名规则有助于(个人认为:Java的高度封装的代价就是使用起来比较麻烦,函数名很多、很长,但是相较于C++自己写类来说还是方便的多了)类的使用,函数调用起来,一个对应一个,这样结构就很清晰,不会因为这个类不是自己封装的就用错函数,所以使用比较放心。虽然也有一些缺点,比如说,Java确实运行起来比C++慢很多,而且要重载的话就不是那么容易的事了。不过现阶段来看,Java的大数类还是够用了。
hdu 1131 原题如下:
Count the Trees
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1254 Accepted Submission(s): 817
Problem Description
Another common social inability is known as ACM (Abnormally Compulsive Meditation). This psychological disorder is somewhat common among programmers. It can be described as the temporary (although frequent) loss of the faculty of speech when the whole power of the brain is applied to something extremely interesting or challenging.
Juan is a very gifted programmer, and has a severe case of ACM (he even participated in an ACM world championship a few months ago). Lately, his loved ones are worried about him, because he has found a new exciting problem to exercise his intellectual powers, and he has been speechless for several weeks now. The problem is the determination of the number of different labeled binary trees that can be built using exactly n different elements.
For example, given one element A, just one binary tree can be formed (using A as the root of the tree). With two elements, A and B, four different binary trees can be created, as shown in the figure.
Juan is a very gifted programmer, and has a severe case of ACM (he even participated in an ACM world championship a few months ago). Lately, his loved ones are worried about him, because he has found a new exciting problem to exercise his intellectual powers, and he has been speechless for several weeks now. The problem is the determination of the number of different labeled binary trees that can be built using exactly n different elements.
For example, given one element A, just one binary tree can be formed (using A as the root of the tree). With two elements, A and B, four different binary trees can be created, as shown in the figure.

If you are able to provide a solution for this problem, Juan will be able to talk again, and his friends and family will be forever grateful.
Input
The input will consist of several input cases, one per line. Each input case will be specified by the number n ( 1 ≤ n ≤ 100 ) of different elements that must be used to form the trees. A number 0 will mark the end of input and is not to be processed.
Output
For each input case print the number of binary trees that can be built using the n elements, followed by a newline character.
Sample Input
1
2
10
25
0
Sample Output
1
4
60949324800
75414671852339208296275849248768000000
代码如下:
1 //5. 大数问题之Catalan数 ~java~ hdu 1131 2 import java.math.BigInteger; 3 import java.util.Scanner; 4 5 public class Main 6 { 7 public static void main(String[] args) 8 { 9 Scanner cin = new Scanner(System.in); 10 int n; 11 BigInteger h[]=new BigInteger[105]; 12 h[0]=h[1]=BigInteger.ONE; 13 for(int i=2;i<=100;i++) 14 { 15 h[i]=BigInteger.ZERO; 16 for(int j=0;j<i;j++) 17 h[i]=h[i].add(h[j].multiply(h[i-1-j])); 18 } 19 BigInteger f[]=new BigInteger[105]; 20 f[1]=BigInteger.ONE; 21 for(int i=2;i<=100;i++) 22 f[i]=f[i-1].multiply(BigInteger.valueOf(i)); 23 while(cin.hasNext()) 24 { 25 n=cin.nextInt(); 26 if(n==0) break; 27 System.out.println(f[n].multiply(h[n])); 28 } 29 } 30 }
2013-08-11
晴
浙公网安备 33010602011771号