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 的表达式的更多相关文章

  1. Javascript中递归造成的堆栈溢出及解决方案

    关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...

  2. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

  3. Python中递归的最大次数

    实际应用中遇到了一个python递归调用的问题,报错如下: RuntimeError: maximum recursion depth exceeded while calling a Python ...

  4. 暑假集训单切赛第一场 CF 266E More Queries to Array(线段树+二项式展开式)

    比赛时,第二题就是做的这个,当时果断没仔细考虑,直接用线段树暴力求.结果易想而知,超时了. 比赛后搜了搜题解,恍然大悟. 思路:显然用线段树,但是由于每次查询都会有变,所以不可能存储题目中的式子.   ...

  5. PHP中递归最详解释.

    说到递归函数想必会有很多同学感到晕晕的,很难绕,容易绕错,那下面就让我来为大家详解一下. 首先,什么是递归函数呢? 1.所谓递归:指的是在函数内部,调用函数自身的操作.2.递归分两布:递(从最外层函数 ...

  6. PHP中递归的实现(附例子)

    递归函数是一种调用自己的函数.写递归函数时要小心,因为可能会无穷递归下去.必须确保有充分的方法来终止递归. 一:使用参数引用完成递归函数.操作的是同一块内存地址. <?php $i=1; fun ...

  7. Java中递归和循环的优劣

    介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归 ...

  8. Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。

    题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...

  9. C语言 · 递归求二项式系数值

    算法训练 6-1 递归求二项式系数值   时间限制:10.0s   内存限制:256.0MB      问题描述 样例输入 一个满足题目要求的输入范例.3 10 样例输出 与上面的样例输入对应的输出. ...

随机推荐

  1. Confluence 6 在数据源连接中启用校验查询

    确定 Confluence 在数据库连接池中校验数据库连接: 停止 Confluence. 编辑 <installation-directory>/conf/server.xml 文件(或 ...

  2. linux下命令窗口中$和#的区别

    $表示现在的用户是普通用户#表示现在的用户是root用户 # 代表你能做任何事$ 代表你能做一些/下和/home目录的所有事

  3. linux符号与正则表达式

    特殊符号    >    或者1>   标准输出重定向 先把文件的内容清空  再放入新的内容 >> 或   2>>  追加重定向  把内容放入文件的最后一行 1   ...

  4. 在前台根据传过来的XX级别的数字转XX的名字

    需求描述:进入页面,展示列表,列表中有个XX级别的项,数据库中的级别使用1234来存放的,现在要转成对应的一级XX,二级XX,三级XX,四级XX. 吐槽一下:正常的做法应该是在后台,就把查出来的级别1 ...

  5. 关于JDBC的总结

    1. Spring JDBC子框架是什么 答:就是一个Spring框架内置的持久层框架.既然是一个持久层框架,作用就是对数据库增删改查!! 2. SpringJDBC是使用声明类操作数据库的? 答:J ...

  6. bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑

    进阶指南上的做法是分块的.. 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的 ...

  7. hdu2460 e-DCC染色缩点+暴力LCA

    /* 给定一个无向图,往里面加边,问加第i条边时图中的桥数 首先肯定要求初始状态下的桥,染色缩点 每次给定的边为(u,v), 那么u->lca(u,v)->v路上的所有边都不再是桥 求LC ...

  8. linux下搭建SVN

      官网下载: http://subversion.apache.org/packages.html SVN客户端:TortoiseSVN :https://tortoisesvn.net/downl ...

  9. 步步為營-97-MyMVC3

    說明: 解決另外一個不合理之處:通過控制器完成處理 1:在mvc文件夾下面添加一個工廠類文件DefaultControllerFactory 1.2進一步升級為抽象工廠 2 下一步如何規範Contro ...

  10. Linux-server-sshd

    Linux-server-sshd 1:安装 OpenSSH 服务需要4 个软件包 openssh-5.3p1-114.el6_7.x86_64:包含OpenSSH 服务器及客户端需要的核心文件 op ...