求解Catalan数,(大数相乘,大数相除,大数相加)
Catalan数
卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名。历史上,清代数学家明安图(1692年-1763年)在其《割圜密率捷法》最早用到“卡塔兰数”,远远早于卡塔兰。有中国学者建议将此数命名为“明安图数”或“明安图-卡塔兰数”。卡塔兰数的一般公式为 C(2n,n)/(n+1)。
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数,(大数相乘,大数相除,大数相加)相关推荐
- 面试官让你用C语言实现大数相乘,慌吗?
在之前的笔试题解析里面,我写了大数相加的问题,这里再剖析一个大数相乘,顾名思义,大数相乘就是这个数已经大到最大的数据类型都没有办法保存了. 我们看看最大的数据类型可以保存多大的数据. #include ...
- LeetCode-Problem 43:大数相乘
算法问题 给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积. 算法实现 以下是大神的算法,膜拜大神: 首先,长度位m的数乘以长度为n的数的结果不超过m+n. ...
- Catalan数表达式完整推导
文章目录 写在前面 求解 写在前面 推导一下Catalan数的表示式,主要用到生成函数的方法,主要难点是幂级数的计算. 求解 Catalan数的递推关系满足: cn=∑j=0n−1cjcn−1−j,( ...
- 大数相乘、大数相加、大数相减Java版本
为什么80%的码农都做不了架构师?>>> 题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现.否则的话可以使用如下方式来实 ...
- 超大数相乘的java代码,java版大数相乘
在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次 ...
- 大数相乘(C语言,分治算法)
问题: 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算.大数运算主要有加.减.乘三种方法. 下面就 ...
- 历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘
历届试题 矩阵翻硬币 时间限制:1.0s 内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬 ...
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
- c语言实现大数相乘,最简单的C语言实现大数相乘
前言 : 实现大数相乘比相加要难一点 , 但是仔细分析会发现很多共同之处 分析 : 1. 由数学归纳法会发现用一般的两数相乘方法计算 , 每计算一次都能够确定最终结果的一位数字 2. 比如说 : 45 ...
- c语言中大数相乘的方法,C++实现大数相乘算法
本文实例为大家分享了C++实现大数相乘的具体代码,供大家参考,具体内容如下 首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘 ...
最新文章
- 彻底搞懂 Nginx 的五大应用场景
- Redis+keepalived 主从搭建
- iptraf 打不开
- 本地数据源:使用firebird数据库
- csv注入java怎么解决_CSV Injection(CSV注入)
- WebRTC Audio Encoder/Decoder Factory 的实现
- 爱立信首席执行官卫翰思离职 投资者已失去耐性
- 量化信噪比 非均匀量化_键摄基础1:为什么要正确曝光/ADC精度和量化噪声
- 利用flex让页脚自适应置底显示
- 年存10W+的年轻人都是怎么攒钱的
- 疫情下的十大堵城:复工后整体拥堵下降37.3%
- 如何列出引用SQL Server中给定表的所有外键?
- Delphi2010新手学习(1)
- 第一阶段·Linux运维基础 第3章·文件属性、正则表达式、文件权限
- 小波变换matlab程序,图像小波变换原理_图像小波变换的matlab实现详解
- 用dnspod进行DNS解析出错的解决方案
- 史上最狠的十二星座分析
- window.print() 表格打印 完美实现分页
- iOS-AFNetworking3.0 使用
- rar,zip文件加密判断
热门文章
- KubeCon上海“行业客户云原生最佳实践日“成功举办,云原生在各行业落地生花...
- raid5磁盘阵列数据恢复方法_服务器数据恢复步骤_存储结构介绍
- 读《富爸爸,穷爸爸》后感(二)
- 工业4.0,智能制造和大规模定制
- mysql统计字数_使用SQL确定文本字段的字数统计
- 微信支付/支付宝指纹支付原理
- 头的各个部位示意图_人体头部结构图解剖图 人体头部结构及功能
- vscode调整代码大小
- [资源]--IOS捷径大全,众多实用小功能
- python怎样分析文献综述_怎么写文献综述?