C++ 中递归实现 二项式展开式(a+b)^ n 的表达式
C++ 中递归实现 二项式展开式 的表达式
前几天,一个数学系读研的同学来问有什么软件可以来求 (a+b)^n 这种表达式类型的展开式,我随口一说了 Octave , 毕竟这个开源的还是可以的,后来他说了句 a 和 b 不一定是实数,那就很尴尬了。就是 a 和 b 仅代表符号。也可以是 (猫 + 狗)^n, 后来决定用CPP 来简单简单实现一下,由于对 CPP 不是很熟,搞了好一段时间,这个算法重点是递归。时间和空间复杂度略高了一点。
代码如下:
#include <iostream>
#include "string.h"
#include <iomanip>
#include <limits>
#include "tgmath.h"
#include <cmath>
#define maxSize 1000
using namespace std;
typedef struct Binomial {
char array[maxSize];
int length;
} Binomial;
typedef struct BinomialMatrix {
string element[maxSize];
int length;
} BinomialMatrix;
void CreateBinomial(Binomial &binomial, char a[], int length) {
int i;
for(i = 0; i < length; ++i) {
binomial.array[i] = a[i];
}
binomial.length = length;
}
void PrintBinomialValue(Binomial binomial) {
for(int i = 0; i < binomial.length; ++i) {
cout << binomial.array[i] << " ";
}
cout << "\n" << endl;
}
void PrintBinoMatrix(BinomialMatrix matrix, int n) {
int i;
cout << "\n" << "The Result is :" << endl;
int loopStart = matrix.length <= 2 ? 0 : 2;
for(i = loopStart; i < matrix.length; ++i) {
if(i == matrix.length - 1) {
cout << matrix.element[i] << endl;
} else {
cout << matrix.element[i] << "+";
}
}
}
void CalculateExpression(Binomial binomial, BinomialMatrix &matrix,
BinomialMatrix &matrixTemp, int n) {
int i, j, k = 0, t = 0, p = 0;
if(n == 0) {
matrix.element[n] = "1";
matrix.length = 1;
return;
}
matrix.element[k] = string(1, binomial.array[k]);
matrix.element[k + 1] = string(1, binomial.array[k + 1]);
matrix.length = 2;
int loopLength = matrixTemp.length - matrix.length > 0 ? matrix.length : 0;
if(matrixTemp.length < 10000) {
for(i = 0; i < matrix.length; ++i) {
for(j = loopLength; j < matrixTemp.length; ++j) {
matrix.element[matrix.length + t] = matrix.element[i] + matrixTemp.element[j];
++t;
}
}
matrix.length = matrix.length + t;
}
if(n >= 2) {
CalculateExpression(binomial, matrixTemp, matrix, --n);
}
}
int main() {
int n;
char a[] = "ab";
Binomial bino;
BinomialMatrix matrix;
BinomialMatrix matrixTemp;
CreateBinomial(bino, a, 2);
cout << "Please input the a and b to calculate the (a+b)^n expression!" << endl;
cout << "Give me the value of n" << endl;
while(!(cin >> n)) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "\nPlease type a number n:\t";
}
if(n < 0 || n > maxSize) {
cout << "The number you input is invalid!" << endl;
return 0;
}
CalculateExpression(bino, matrix, matrixTemp, n);
if(matrix.length >= matrixTemp.length) {
PrintBinoMatrix(matrix, n);
} else {
PrintBinoMatrix(matrixTemp, n);
}
}
C++ 中递归实现 二项式展开式(a+b)^ n 的表达式的更多相关文章
- Javascript中递归造成的堆栈溢出及解决方案
关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...
- java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...
- Python中递归的最大次数
实际应用中遇到了一个python递归调用的问题,报错如下: RuntimeError: maximum recursion depth exceeded while calling a Python ...
- 暑假集训单切赛第一场 CF 266E More Queries to Array(线段树+二项式展开式)
比赛时,第二题就是做的这个,当时果断没仔细考虑,直接用线段树暴力求.结果易想而知,超时了. 比赛后搜了搜题解,恍然大悟. 思路:显然用线段树,但是由于每次查询都会有变,所以不可能存储题目中的式子. ...
- PHP中递归最详解释.
说到递归函数想必会有很多同学感到晕晕的,很难绕,容易绕错,那下面就让我来为大家详解一下. 首先,什么是递归函数呢? 1.所谓递归:指的是在函数内部,调用函数自身的操作.2.递归分两布:递(从最外层函数 ...
- PHP中递归的实现(附例子)
递归函数是一种调用自己的函数.写递归函数时要小心,因为可能会无穷递归下去.必须确保有充分的方法来终止递归. 一:使用参数引用完成递归函数.操作的是同一块内存地址. <?php $i=1; fun ...
- Java中递归和循环的优劣
介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归 ...
- Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。
题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...
- C语言 · 递归求二项式系数值
算法训练 6-1 递归求二项式系数值 时间限制:10.0s 内存限制:256.0MB 问题描述 样例输入 一个满足题目要求的输入范例.3 10 样例输出 与上面的样例输入对应的输出. ...
随机推荐
- Swift中使用oc代码桥接设置
1 将oc的代码拖入项目中 2 新建一个头文件 在头文件中导入你想用的oc头文件 import "****.h" 3 在设置build Setting 中搜索bird 找到 Ob ...
- (六)STL仿函数functor
1.仿函数为算法服务,特点是重载操作符() 2.一共分为3大类,包括算术类,逻辑运算类,相对关系(比较大小):都继承了binary_function 3.仿函数的一些调用示例,其中右边的仿函数没有继承 ...
- nginx+php负载均衡集群环境中的session共享方案梳理
在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...
- 弹框勾选datatable中的数据,点击保存后添加到另一个表中,同一个页面
需求描述:做编辑的时候,点击添加按钮,弹出数据表table2,勾选弹出框中的数据,点击保存后能够添加到table1中,并且已经被添加到table1中的数据,在弹出框中显示已选,checkbox隐藏:t ...
- Op-level的快速算法
十岁的小男孩 本文为终端移植的一个小章节. 目录 引言 FFT Conv2d (7x7, 9x9) Winograd Conv2d (3x3, 5x5) 引言 本节针对CNN进行加速计算的,主要有以下 ...
- jsp 监听器
Servlet API提供了一系列的事件和事件监听接口. 上层的servlet/JSP应用能够通过调用这些API进行事件 驱动的开发.这里监听的所有事件都继承自 java.util.Event对象.监 ...
- bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑
进阶指南上的做法是分块的.. 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的 ...
- C++ Primer 笔记——命名空间
1.我们既可以用 using 声明整个空间,也可以声明部分名字. using namespace std; using std::cout; 2.头文件不应包含 using 声明,因为头文件会拷贝到所 ...
- C程序的内存分配及动态内存
1.程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分:1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局部变量. 函数参数. 返回数据. 返回地址等. ...
- BZOJ 2818 Gcd(欧拉函数+质数筛选)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 9108 Solved: 4066 [Submit][Status][Discu ...