本文共 2208 字,大约阅读时间需要 7 分钟。
就是求一个卡特兰数,如果是C++的话 得用高精度,java 的话 得用 BigInteger。。。
解题思路:
只要掌握卡特兰数的公式就行了,两个公式:
1. 组合公式为 Cn = C(2n,n) / (n+1); 2. 递推公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)
我们采用的是第二个,如果用java 写的话还是比较省事儿的,因为直接有个大数类,所以直接调用就行,所以我也先给一个java的代码(也是第一次写java代码 有点小紧张):
My Java Code:
import java.util.*;import java.math.BigInteger;public class Main { public static void main(String[] args) { BigInteger a[] = new BigInteger[105]; a[0] = BigInteger.ZERO; a[1] = BigInteger.ONE; for(int i=2;i<=102;i++) { a[i] = a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1)); } Scanner in = new Scanner(System.in); while(in.hasNext()) { int n=in.nextInt(); System.out.println(a[n]); } }}
然后接下来就是用c++写的了,这个得用到 高精度乘法,然后采用了bin神的Catalan数模板,觉得还是比较实用的,自己也做了一点小改动,当然适合自己的才是最好的,只要理解起来容易,怎么理解方便怎么来,给一下AC 的C++代码: My Cpp Code:
#include #include #include using namespace std;const int MAXN = 105;int a[MAXN][MAXN];int b[MAXN];///可以作为模板void Catalan(){ int yu,len; a[1][0] = 1; a[1][1] = 1; len = 1; for(int i=2; i =1; j--) { int t = a[i][j]+yu*10; a[i][j] = t/(i+1); yu = t%(i+1); } while(!a[i][len]) len--; a[i][0] = len; }}int main(){ Catalan(); int n; while(cin>>n) { for(int i=a[n][0]; i>0; i--) cout<
转载地址:http://awnka.baihongyu.com/