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 提供了通过层叠样式表(CSS)调整页面展示情况的能力.本页面帮助你理解如何在 Confluence 中使用一些 CSS 样式修改字体样式和字体大小. 下面的代码为自定义的字体代码 ...

  2. opencv 图像矫正

    四个坐标系的转换:https://blog.csdn.net/humanking7/article/details/44756073 标定和矫正:https://blog.csdn.net/u0134 ...

  3. Maven设置本地仓库路径

    在maven文件下的settings.xml中添加<localRepository>F:\cppdy\repo</localRepository>(本地仓库路径)

  4. SpringMVC文件下载与JSON格式

    点击查看上一章 现在JSON这种数据格式是被使用的非常的广泛的,SpringMVC作为目前最受欢迎的框架,它对JSON这种数据格式提供了非常友好的支持,可以说是简单到爆. 在我们SpringMVC中只 ...

  5. Java 并发类

    java.util.concurrent包里 提供了一批线程安全的类 一. java.util.concurrent.atomic java.util.concurrent.atomic包里的原子处理 ...

  6. MySQL数据查询子查询语句

  7. Python列表、元组、字典和集合的区别

    数据结构 是否可变 是否重复 是否有序 定义符号 列表(list) 可变 可重复 有序 [] 元组(tuple) 不可变 可重复 有序 () 字典(dictionary) 可变 可重复 无序 {key ...

  8. SCSS 使用@each 方法循环遍历数组颜色并给li赋值

    $list-bg:red,orange,blue,skyblue; ul{ >li{ height: 30px; @each $c in $list-bg{ $i:index($list-bg, ...

  9. 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API

    在本教程中,将生成用于管理“待办事项”列表的 Web API. 不会生成 UI. 概述 以下是将创建的 API: API 描述 请求正文 响应正文 GET /api/todo 获取所有待办事项 无 待 ...

  10. 目标检测算法之YOLOv1与v2

    YOLO:You Only Look Once(只需看一眼) 基于深度学习方法的一个特点就是实现端到端的检测,相对于其他目标检测与识别方法(如Fast R-CNN)将目标识别任务分成目标区域预测和类别 ...