在这儿主要讲解怎样求比较大的卡特兰数,不能直接求,只能用到高精度的思想来求
HDU1023 1130 1134
可做模板
#include<iostream> #include<cmath> #include<algorithm> #include<cstdio> using namespace std; int a[101][101]; int b[101]; void Catanlan() { int len; int cover; int temp; a[1][0]=b[1]=1;//先处理1 len=1; for(int i=2;i<101;i++) //卡特兰数的公式 { for(int j=0;j<len;j++) a[i][j]=a[i-1][j]*(4*i-2); cover=0; for(int j=0;j<len;j++)//高精度的思想 { temp=a[i][j]+cover; a[i][j]=temp%10; cover=temp/10; } while(cover)//最高位不为0 { a[i][len++]=cover%10; cover/=10; } cover=0; for(int j=len-1;j>=0;j--)//除法 { temp=cover*10+a[i][j]; a[i][j]=temp/(i+1); cover=temp%(i+1); } while(!a[i][len-1]) len--; b[i]=len; } } int main() { // freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin); int n; Catanlan(); while(cin>>n) { for(int i=b[n]-1;i>=0;i--) { cout<<a[n][i]; } cout<<endl; } return 0; }
POJ2084
http://poj.org/problem?id=2084
import java.math.*; import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner cin =new Scanner(system.in); BigInteger num[] =new BigInteger[101]; num[0]=BigInteger.ONE; num[1]=BigInteger.ONE; for(int i=2;i<101;i++) { num[i]=num[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1)); } while(cin.hasNextInt()) { int n=cin.nextInt(); if(n==-1)break; System.out.println(num[n]); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。