Catalan数

卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名。历史上,清代数学家明安图(1692年-1763年)在其《割圜密率捷法》最早用到“卡塔兰数”,远远早于卡塔兰。有中国学者建议将此数命名为“明安图数”或“明安图-卡塔兰数”。卡塔兰数的一般公式为 C(2n,n)/(n+1)。

性质:
令h(0)=1,h(1)=1,卡塔兰数满足递归式:
h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2),这是n阶递推关系;
还可以化简为1阶递推关系: 如h(n)=(4n-2)/(n+1)*h(n-1) ,(n>1)  h(0)=1
该递推关系的解为:h(n)=C(2n,n)/(n+1)=P(2n,n)/(n+1)!=(2n)!/(n!*(n+1)!) (n=1,2,3,...)
卡塔兰数列的前几项为 [注: n = 0, 1, 2, 3, … n]
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
代码求解:
  大数相加

 1 //大数相加
 2 string add(string s1,string s2)
 3 {
 4     if(s1.length()<s2.length())
 5     {
 6         string temp=s1;
 7         s1=s2;
 8         s2=temp;
 9     }
10     int i,j;
11     for(i=s1.length()-1,j=s2.length()-1; i>=0; i--,j--)
12     {
13         s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
14         if(s1[i]-'0'>=10)
15         {
16             s1[i]=char((s1[i]-'0')%10+'0');
17             if(i) s1[i-1]++;
18             else s1='1'+s1;
19         }
20     }
21     return s1;
22 }

  大数相乘

 1 //大数相乘
 2 string mult(string a,string b)
 3 {
 4     int flag=0,i,j,k,p,q,t,max;
 5     char ch;
 6     string c,ans;
 7     p=a.size()-1;
 8     q=b.size()-1;
 9     ans="0";
10     for(i=p; i>=0; i--)
11     {
12         flag=0;
13         c="";
14         for(j=i; j<p; j++) c+='0';
15         for(j=q; j>=0; j--)
16         {
17             t=(b[j]-'0')*(a[i]-'0')+flag;
18             flag=t/10;
19             c+=(t%10+'0');
20         }
21         if(flag) c+=(flag+'0');
22         for(j=0,k=c.size()-1; j<k; j++,k--)
23         {
24             ch=c[j];
25             c[j]=c[k];
26             c[k]=ch;
27         }
28         ans=add(ans,c);
29     }
30     return ans;
31 }

  大数除以小数

 1 //大数除以小数
 2 string div(string src,int n)
 3 {
 4     string dest="";
 5     int len = src.length(),i,k,t = 0 , s = 0;
 6     bool flag = true;
 7     for(i=0,k=0; i<len; i++)
 8     {
 9         t = s*10+(src[i]-48);
10         if(t/n>0 || t==0)
11             dest += (t/n+48),s = t%n,flag = false;
12         else
13         {
14             s = t;
15             if(!flag)
16                 dest += '0';
17         }
18     }
19     return dest;
20 }

  求解Catalan数

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <vector>
  7 #include <map>
  8 #include<string.h>
  9 #include<stack>
 10 #include<set>
 11 #include <queue>
 12 using namespace std;
 13 string s[120];
 14
 15 //大数相加
 16 string add(string s1,string s2)
 17 {
 18     if(s1.length()<s2.length())
 19     {
 20         string temp=s1;
 21         s1=s2;
 22         s2=temp;
 23     }
 24     int i,j;
 25     for(i=s1.length()-1,j=s2.length()-1; i>=0; i--,j--)
 26     {
 27         s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
 28         if(s1[i]-'0'>=10)
 29         {
 30             s1[i]=char((s1[i]-'0')%10+'0');
 31             if(i) s1[i-1]++;
 32             else s1='1'+s1;
 33         }
 34     }
 35     return s1;
 36 }
 37
 38 //大数相乘
 39 string mult(string a,string b)
 40 {
 41     int flag=0,i,j,k,p,q,t,max;
 42     char ch;
 43     string c,ans;
 44     p=a.size()-1;
 45     q=b.size()-1;
 46     ans="0";
 47     for(i=p; i>=0; i--)
 48     {
 49         flag=0;
 50         c="";
 51         for(j=i; j<p; j++) c+='0';
 52         for(j=q; j>=0; j--)
 53         {
 54             t=(b[j]-'0')*(a[i]-'0')+flag;
 55             flag=t/10;
 56             c+=(t%10+'0');
 57         }
 58         if(flag) c+=(flag+'0');
 59         for(j=0,k=c.size()-1; j<k; j++,k--)
 60         {
 61             ch=c[j];
 62             c[j]=c[k];
 63             c[k]=ch;
 64         }
 65         ans=add(ans,c);
 66     }
 67     return ans;
 68 }
 69
 70 //大数除以小数
 71 string div(string src,int n)
 72 {
 73     string dest="";
 74     int len = src.length(),i,k,t = 0 , s = 0;
 75     bool flag = true;
 76     for(i=0,k=0; i<len; i++)
 77     {
 78         t = s*10+(src[i]-48);
 79         if(t/n>0 || t==0)
 80             dest += (t/n+48),s = t%n,flag = false;
 81         else
 82         {
 83             s = t;
 84             if(!flag)
 85                 dest += '0';
 86         }
 87     }
 88     return dest;
 89 }
 90 int main()
 91 {
 92     s[1]="1";
 93     for(int i=2; i<101; i++)
 94     {
 95         char s1[10000];
 96         sprintf(s1,"%d",4*i-2);
 97         s[i] = mult(s[i-1],s1);
 98         s[i] = div(s[i],i+1);
 99     }
100     int n;
101     while(scanf("%d",&n))
102     {
103         if(n==-1) break;
104         cout<<s[n]<<endl;
105     }
106     return 0;
107 }

转载于:https://www.cnblogs.com/LGJC1314/p/7002595.html

求解Catalan数,(大数相乘,大数相除,大数相加)相关推荐

  1. 面试官让你用C语言实现大数相乘,慌吗?

    在之前的笔试题解析里面,我写了大数相加的问题,这里再剖析一个大数相乘,顾名思义,大数相乘就是这个数已经大到最大的数据类型都没有办法保存了. 我们看看最大的数据类型可以保存多大的数据. #include ...

  2. LeetCode-Problem 43:大数相乘

    算法问题 给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积. 算法实现 以下是大神的算法,膜拜大神: 首先,长度位m的数乘以长度为n的数的结果不超过m+n. ...

  3. Catalan数表达式完整推导

    文章目录 写在前面 求解 写在前面 推导一下Catalan数的表示式,主要用到生成函数的方法,主要难点是幂级数的计算. 求解 Catalan数的递推关系满足: cn=∑j=0n−1cjcn−1−j,( ...

  4. 大数相乘、大数相加、大数相减Java版本

    为什么80%的码农都做不了架构师?>>>    题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现.否则的话可以使用如下方式来实 ...

  5. 超大数相乘的java代码,java版大数相乘

    在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次 ...

  6. 大数相乘(C语言,分治算法)

    问题: 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算.大数运算主要有加.减.乘三种方法. 下面就 ...

  7. 历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘

    历届试题 矩阵翻硬币   时间限制:1.0s   内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬 ...

  8. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  9. c语言实现大数相乘,最简单的C语言实现大数相乘

    前言 : 实现大数相乘比相加要难一点 , 但是仔细分析会发现很多共同之处 分析 : 1. 由数学归纳法会发现用一般的两数相乘方法计算 , 每计算一次都能够确定最终结果的一位数字 2. 比如说 : 45 ...

  10. c语言中大数相乘的方法,C++实现大数相乘算法

    本文实例为大家分享了C++实现大数相乘的具体代码,供大家参考,具体内容如下 首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘 ...

最新文章

  1. 彻底搞懂 Nginx 的五大应用场景
  2. Redis+keepalived 主从搭建
  3. iptraf 打不开
  4. 本地数据源:使用firebird数据库
  5. csv注入java怎么解决_CSV Injection(CSV注入)
  6. WebRTC Audio Encoder/Decoder Factory 的实现
  7. 爱立信首席执行官卫翰思离职 投资者已失去耐性
  8. 量化信噪比 非均匀量化_键摄基础1:为什么要正确曝光/ADC精度和量化噪声
  9. 利用flex让页脚自适应置底显示
  10. 年存10W+的年轻人都是怎么攒钱的
  11. 疫情下的十大堵城:复工后整体拥堵下降37.3%
  12. 如何列出引用SQL Server中给定表的所有外键?
  13. Delphi2010新手学习(1)
  14. 第一阶段·Linux运维基础 第3章·文件属性、正则表达式、文件权限
  15. 小波变换matlab程序,图像小波变换原理_图像小波变换的matlab实现详解
  16. 用dnspod进行DNS解析出错的解决方案
  17. 史上最狠的十二星座分析
  18. window.print() 表格打印 完美实现分页
  19. iOS-AFNetworking3.0 使用
  20. rar,zip文件加密判断

热门文章

  1. KubeCon上海“行业客户云原生最佳实践日“成功举办,云原生在各行业落地生花...
  2. raid5磁盘阵列数据恢复方法_服务器数据恢复步骤_存储结构介绍
  3. 读《富爸爸,穷爸爸》后感(二)
  4. 工业4.0,智能制造和大规模定制
  5. mysql统计字数_使用SQL确定文本字段的字数统计
  6. 微信支付/支付宝指纹支付原理
  7. 头的各个部位示意图_人体头部结构图解剖图 人体头部结构及功能
  8. vscode调整代码大小
  9. [资源]--IOS捷径大全,众多实用小功能
  10. python怎样分析文献综述_怎么写文献综述?