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 样例输出 与上面的样例输入对应的输出. ...
随机推荐
- Confluence 6 中样式化字体
Confluence 提供了通过层叠样式表(CSS)调整页面展示情况的能力.本页面帮助你理解如何在 Confluence 中使用一些 CSS 样式修改字体样式和字体大小. 下面的代码为自定义的字体代码 ...
- opencv 图像矫正
四个坐标系的转换:https://blog.csdn.net/humanking7/article/details/44756073 标定和矫正:https://blog.csdn.net/u0134 ...
- Maven设置本地仓库路径
在maven文件下的settings.xml中添加<localRepository>F:\cppdy\repo</localRepository>(本地仓库路径)
- SpringMVC文件下载与JSON格式
点击查看上一章 现在JSON这种数据格式是被使用的非常的广泛的,SpringMVC作为目前最受欢迎的框架,它对JSON这种数据格式提供了非常友好的支持,可以说是简单到爆. 在我们SpringMVC中只 ...
- Java 并发类
java.util.concurrent包里 提供了一批线程安全的类 一. java.util.concurrent.atomic java.util.concurrent.atomic包里的原子处理 ...
- MySQL数据查询子查询语句
- Python列表、元组、字典和集合的区别
数据结构 是否可变 是否重复 是否有序 定义符号 列表(list) 可变 可重复 有序 [] 元组(tuple) 不可变 可重复 有序 () 字典(dictionary) 可变 可重复 无序 {key ...
- SCSS 使用@each 方法循环遍历数组颜色并给li赋值
$list-bg:red,orange,blue,skyblue; ul{ >li{ height: 30px; @each $c in $list-bg{ $i:index($list-bg, ...
- 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API
在本教程中,将生成用于管理“待办事项”列表的 Web API. 不会生成 UI. 概述 以下是将创建的 API: API 描述 请求正文 响应正文 GET /api/todo 获取所有待办事项 无 待 ...
- 目标检测算法之YOLOv1与v2
YOLO:You Only Look Once(只需看一眼) 基于深度学习方法的一个特点就是实现端到端的检测,相对于其他目标检测与识别方法(如Fast R-CNN)将目标识别任务分成目标区域预测和类别 ...