用到的是卡特兰数原理
比如3个节点可以构成的不同的二叉树一共有5种
Cm n=n!/m!*(n-m)!=n*(n-1)*(n-2)*……(n-m+1)/m*(m-1)*(m-2)……1
前面这一部分就是Am n的计算公式,用Am n 再除以m的阶乘得到的就是Cm n
计算过程中,如果用的是整型,很容易超出它的最大范围
利用Java提供的BigInteger可解决这一问题
创建BigInteger变量
可以将数字转化为long,利用valueof方法将其转化为BigInteger
也可以利用构造方法,将字符串转化为long
BigInteger a=BigInteger.valueof(1);
BigInteger b=BigInteger.valueof("1");
加减乘除分别是
a.add(b)
a.subtract(b)
a.multiply(b)
a.divide(b)
package May04;
import java.math.BigInteger;
import java.util.Scanner;
public class fu201903 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
//n个二叉树结点
int n=in.nextInt();
//关键是求c n 2n,涉及到BigInt类的加减乘除
//add subtract multiply divide
//初始化是BigInteger result=new BigInteger(s)
BigInteger numerator =BigInteger.valueOf(1);
BigInteger denominator =BigInteger.valueOf(1);
//求阶乘
//求分子
for(int i=2*n;i>=n+1;i--)
{
numerator=numerator.multiply(BigInteger.valueOf(i));
}
//求分母
for(int i=n;i>=1;i--)
{
denominator=denominator.multiply(BigInteger.valueOf(i));
}
//相除再除以n+1
BigInteger result =numerator;
result=result.divide(denominator.multiply(BigInteger.valueOf(n+1)));
System.out.println(result);
}
}