一元多项式乘法
- 格式:doc
- 大小:223.00 KB
- 文档页数:14
多项式的乘法多项式的乘法是代数学中的一种基本运算,用于计算两个多项式的乘积。
在多项式的乘法运算中,我们将一个多项式的每一项与另一个多项式的每一项相乘,并将结果相加得到最终的乘积。
本文将介绍多项式的乘法运算规则,并通过例子详细说明其计算方法。
1. 多项式的乘法运算规则设有两个多项式:P(x) = anxn + an-1xn-1 + ... + a1x + a0Q(x) = bmxm + bm-1xm-1 + ... + b1x + b0其中,an, an-1, ..., a1, a0, bn, bm-1, ..., b1, b0为常数系数,n, m为非负整数,n ≥ m。
两个多项式的乘积定义为:P(x) * Q(x) = (anxn + an-1xn-1 + ... + a1x + a0) * (bmxm + bm-1xm-1 + ... + b1x + b0)根据乘法的分配律,我们可以将上式展开为:P(x) * Q(x) = anxn * (bmxm + bm-1xm-1 + ... + b1x + b0) + an-1xn-1 * (bmxm + bm-1xm-1 + ... + b1x + b0) + ... + a1x * (bmxm + bm-1xm-1 + ... + b1x + b0) + a0 * (bmxm + bm-1xm-1 + ... + b1x + b0)再根据乘法的结合律,我们可以进一步简化上式为:P(x) * Q(x) = anxn * bmxm + anxn * bm-1xm-1 + ... + anxn * b1x + anxn * b0 + an-1xn-1 * bmxm + an-1xn-1 * bm-1xm-1 + ... + an-1xn-1 *b1x + an-1xn-1 * b0 + ... + a1x * bmxm + a1x * bm-1xm-1 + ... + a1x * b1x + a1x * b0 + a0 * bmxm + a0 * bm-1xm-1 + ... + a0 * b1x + a0 * b0由此可见,多项式的乘法运算实际上是将两个多项式的每一项进行相乘,并将结果按指数次数相加。
多项式的乘法在代数学中,多项式的乘法是一项基本的运算。
多项式是由常数和变量的乘积相加而成的表达式。
本文将介绍多项式乘法的定义、运算法则以及一些实例应用。
一、多项式乘法的定义多项式乘法是指将两个或多个多项式相乘的过程。
一个多项式可以写成如下形式:P(x) = a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0其中,a_n, a_{n-1}, ... , a_1, a_0为常数系数,x为自变量,n为多项式的次数。
对于两个多项式:P(x) = a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0Q(x) = b_mx^m + b_{m-1}x^{m-1} + ... + b_1x + b_0它们的乘积为:P(x) * Q(x) = (a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0) * (b_mx^m + b_{m-1}x^{m-1} + ... + b_1x + b_0)二、多项式乘法的运算法则多项式乘法遵循以下运算法则:1. 每一项的指数相加:两个同类项的指数相加,如x^m * x^n =x^{(m+n)}。
2. 常数系数相乘:两个同类项的常数系数相乘,如a_i * b_i。
3. 扩展运算:将每个项与另一个多项式的所有项进行相乘。
多项式的每一项都与另一个多项式的所有项进行相乘,并将结果相加。
三、多项式乘法的实例应用多项式乘法在数学和科学领域有广泛的应用。
以下是一些实例:1. 几何应用:在几何学中,多项式乘法用于计算多项式函数的图像和方程。
例如,通过将两个多项式相乘,可以得到一个表示曲线的方程。
2. 物理学应用:多项式乘法用于描述物理现象中的变化。
例如,通过将时间和速度的多项式相乘,可以得到物体的位移多项式。
3. 统计学应用:多项式乘法被用于计算和分析统计数据。
例如,在回归分析中,通过将自变量和系数的多项式相乘,可以找到一个最佳拟合的多项式函数。
第1关:基于链表的两个一元多项式的基本运算在计算机科学中,一元多项式是常见的代数表达式形式,通常用来表示多项式函数。
虽然一元多项式的计算看似简单,但如果使用数据结构来实现,将会大大提高计算效率。
这篇文档将详细介绍基于链表的两个一元多项式的基本运算。
一元多项式的定义:在代数学中,一元多项式是一种含有一个未知数的代数多项式。
它是指一个代数式,它是由保持仅仅又有限个多项式的乘积。
此外,一元多项式在基本运算方面具有封闭性,这也是为什么它被广泛应用的原因之一。
在这里,我们将讨论在计算机科学中对一元多项式的实现。
链表的定义:链表是一种线性数据结构,其中数据元素不是常规的数组索引组织,而是通过信息存储元素之间的链来相互连接。
每个元素被称为节点,并且每个节点包含一个下一个节点的指针。
基于链表的一元多项式的实现:基于链表的一元多项式的实现涉及到将每个多项式的系数和指数存储为链表中的节点。
这种实现的主要优点是,它可以轻松地进行添加和删除操作,可以有效地分配内存,而不会浪费存储空间。
考虑到一元多项式的基本运算包括加法,减法和乘法,我们将详细介绍每种操作的实现。
一、基于链表的两个一元多项式的加法操作在实现一元多项式加法时,我们需要创建两个链表来存储两个多项式。
链表节点应该包含两个属性:系数和指数。
然后我们可以使用以下方法将两个多项式相加。
1. 定义两个指针p1和p2分别指向多项式链表的头部。
2. 定义一个新链表,用于存储相加的项。
3. 当p1和p2都不为空时循环进行以下操作:a. 如果p1当前节点的指数小于p2当前节点的指数,则将p1的节点添加到新链表中并将p1指针向下移动一个节点。
b. 如果p1当前节点的指数大于p2当前节点的指数,则将p2的节点添加到新链表中并将p2指针向下移动一个节点。
c. 如果p1和p2当前节点的指数相等,则将两个节点的系数相加,并将结果添加到新链表中,并将p1和p2指针都向下移动一个节点。
的所有剩余项添加到新链表中。
第一章 多项式§1 数域 §2 一元多项式一、数域1、定义:P 是由一些复数组成的集合,包含0和1,如果P 中的任意两个数的和、差、积、商(除数不为零)仍在P 中,则称P 为一个数域。
简单地说:P 是一个含0和1的非空集合,且对四种运算封闭。
2、例1:有理数的集合Q ,实数集合R ,复数集合C 均为数域。
例2:{}()2,2Q Q b a b a P =∈+=是一个数域。
证明:Pd c adcb d c bd ac d c d c d c b a d c b a d c d c P bc ad bd ac d c b a P d b c a d c b a P d b c a d c b a Qd c b a P d c b a P P ∈--+--=-+-+=++≠-≠+∈+++=++∈-+-=+-+∈+++=+++∈∈++∀∈+=∈+=2222)2)(2()2)(2(2202,02)5(2)()2()2)(2)(4(2)()()2()2)(3(2)()()2()2)(2(,,,,2,22011;2000)1(2222有若故P 是一个数域。
练习:证{}Q b a bi a i Q ∈+=,)(是一个数域。
二、一元多项式注:在数域P 上进行讨论,x 是一个符号。
1、定义:0111a x a x a x a n n n n ++++-- ,(-∈Z n )称为数域P 上的一元多项式。
其中P a a a n ∈,,,10 ,用 ),(),(x g x f 表示。
若0≠n a ,则称n a 为首项系数,n 为多项式的次数,用))((x f ∂表示。
0a 为常数项。
2、相等:)()(x g x f =当且仅当次数相同,对应系数相等。
3、运算:设0111)(a x a x a x a x f n n n n ++++=-- ,0111)(b x b x b x b x g m m m m ++++=-- ,m n ≥(1) 加法: )()()()()(00b a x b a x b a x g x f m m m n n n +++++++=+其中:011====+-m n n b b b())(),(max ))()((x g x f x g x f ≤+∂ (2) 乘法:snm s s j i j i m n m n m n m n m n xb a b a x b a b a x b a b a x b a x g x f ∑∑+==+-+--+⎪⎪⎭⎫ ⎝⎛=+++++++=0001001111)()()()()(若:0)(,0)(≠≠x g x f ,则))(())(())()((x g x f x g x f ∂+∂=∂ 4、运算规律:(1))()()()(x f x g x g x f +=+(加法交换律)(2)))()(()()())()((x h x g x f x h x g x f ++=++(加法结合律) (3))()()()(x f x g x g x f =(乘法交换律)(4)))()()(()())()((x h x g x f x h x g x f =(乘法结合律) (5))()()()())()()((x h x f x g x f x h x g x f +=+(分配律) (6)若,0)(),()()()(≠=x f x h x f x g x f 则)()(x h x g =(消去律) 5、多项式环。
多项式的零点与因式定理多项式是数学中重要的概念之一,它在代数学、数论以及计算机科学等领域都有广泛的应用。
本文将讨论多项式的零点及因式定理,并探讨它们在解析几何和实际问题中的意义。
一、多项式的零点首先,让我们回顾一下多项式的定义。
多项式是由常数、变量和指数幂运算(加法、乘法和幂运算)组成的表达式。
一个一元多项式的一般形式如下:P(x) = aₙxⁿ + aₙ₋₁xⁿ⁻¹ + ... + a₂x² + a₁x + a₀其中,aₙ, aₙ₋₁, ..., a₂, a₁, a₀是多项式的系数,x是多项式的变量,n是非负整数。
一个多项式的零点是使多项式等于零的解。
例如,多项式 P(x) = x²- 4 的零点为 x = 2 和 x = -2,因为当 x = 2 或 x = -2 时,P(x) = 0。
二、一次多项式的因式定理接下来,我们将讨论一次多项式的因式定理。
一次多项式是次数为1的多项式,一般形式可表示为P(x) = ax + b,其中a、b 是常数,且a ≠ 0。
因式定理指出,如果 x = c 是一次多项式 P(x) 的零点,那么 (x - c)是 P(x) 的一个因式。
换句话说,一次多项式 P(x) 除以 (x - c) 的余式为0。
例如,考虑一次多项式 P(x) = 2x - 3。
我们发现,当 x = 3/2 时,P(x) = 0。
因此,根据因式定理,(x - 3/2) 是 P(x) 的一个因式。
三、二次及高次多项式的因式定理当我们处理二次及高次多项式时,因式定理的应用稍微复杂一些。
对于一个二次多项式 P(x) = ax² + bx + c(其中a ≠ 0),如果 x = c是它的一个零点,那么 (x - c) 是 P(x) 的一个因式。
当我们考虑高次多项式时,因式定理的应用不仅限于一次因子。
我们可以使用因式定理来分解多项式为一系列的一次和二次因子,直到不能再分解为止。
目录一、问题分析.................................... 错误!未定义书签。
问题描述 ........................................................................ 错误!未定义书签。
问题的数学模型............................................................. 错误!未定义书签。
构造数据结构................................................................. 错误!未定义书签。
二、系统分析 ...................................................................... 错误!未定义书签。
可行性研究..................................................................... 错误!未定义书签。
系统结构与主要功能模块 ............................................. 错误!未定义书签。
三、系统设计 ...................................................................... 错误!未定义书签。
系统设计目的与要求 ....................................................... 错误!未定义书签。
系统设计内容................................................................... 错误!未定义书签。
功能算法描述与数据结构说明........................................ 错误!未定义书签。
多项式乘法
多项式乘法是一种数学运算,它可以用来计算两个多项式的乘积。
多项式乘法的基本原理是,将两个多项式的每一项分别相乘,然后将所有的乘积相加,得到最终的乘积。
多项式乘法的运算过程可以用一个简单的例子来说明,比如,计算(x+2)(x+3)的乘积,首先将两个多项式的每一项分别相乘,即(x+2)×(x+3),得到x2+5x+6,然后将所有的乘积相加,即x2+5x+6,最终得到x2+5x+6,就是(x+2)(x+3)的乘积。
多项式乘法在数学中有着重要的作用,它可以用来计算多项式的乘积,也可以用来计算多项式的和、差、积等。
多项式乘法的运算过程也可以用来计算多项式的倒数,从而解决复杂的数学问题。
多项式乘法的运算过程也可以用来计算多项式的倒数,从而解决复杂的数学问题。
多项式乘法的运算过程也可以用来计算多项式的倒数,从而解决复杂的数学问题。
总之,多项式乘法是一种重要的数学运算,它可以用来计算多项式的乘积,也可以用来计算多项式的和、差、积等,从而解决复杂的数学问题。
一元多项式的乘法与加法运算
一元多项式的乘法与加法运算
一、乘法运算
1、定义
一元多项式的乘法运算是指在一元多项文的基础上的乘法运算,其中
乘数和被乘数均为一元多项式。
2、运算规则
(1)同序项相乘:两个一元多项式的相同次方项,按照乘法规则运算,系数相乘,指数相加。
(2)求和:将相乘之后的项按次方合起来,系数相加,指数相同。
二、加法运算
1、定义
一元多项式的加法运算是指在一元多项式的基础上的加法运算,其中
加数和被加数均为一元多项式。
2、运算规则
(1)同序项相加:两个一元多项式的相同次方项,按照加法规则运算,系数相加,指数相同。
(2)求和:将相加之后的项按次方合起来,系数相加,指数相同。
以上就是一元多项式的乘法与加法运算,总之,一元多项式的乘法与加法运算主要有以下几点:
(1)乘法运算:同序项相乘,求和,系数相乘,指数相加。
(2)加法运算:同序项相加,求和,系数相加,指数相同。
在C++中,实现一元多项式的乘法涉及到创建一个表示多项式的数据结构,并实现一个函数来执行乘法操作。
以下是一个简单的示例,展示了如何使用结构体和链表来实现这个功能。
首先,我们可以定义一个结构体来表示多项式的一个项,包括系数和指数:cppstruct Term {int coefficient; // 系数int exponent; // 指数Term* next; // 指向下一个项的指针};然后,我们可以定义一个类来表示整个多项式,并实现乘法操作:cpp#include <iostream>using namespace std;struct Term {int coefficient;int exponent;Term* next;};class Polynomial {private:Term* head; // 多项式的第一个项public:Polynomial() : head(nullptr) {}// 向多项式中添加一个项void addTerm(int coefficient, int exponent) {Term* newTerm = new Term;newTerm->coefficient = coefficient;newTerm->exponent = exponent;newTerm->next = head;head = newTerm;}// 执行多项式乘法并返回结果多项式Polynomial multiply(const Polynomial& other) const {Polynomial result;Term* current1 = head;while (current1 != nullptr) {Term* current2 = other.head;while (current2 != nullptr) {int productCoefficient = current1->coefficient * current2->coefficient;int productExponent = current1->exponent + current2->exponent;result.addTerm(productCoefficient, productExponent);current2 = current2->next;}current1 = current1->next;}return result;}// 打印多项式到控制台void print() const {if (head == nullptr) {cout << "0";return;}bool isFirstTerm = true;Term* current = head;while (current != nullptr) {if (!isFirstTerm) {if (current->coefficient > 0) {cout << " + ";} else {cout << " - ";}} else {isFirstTerm = false;}if (current->exponent == 0) {cout << current->coefficient;} else if (current->exponent == 1) {cout << current->coefficient << "x";} else {cout << current->coefficient << "x^" << current->exponent;}current = current->next;}cout << endl;}};现在你可以使用上面的类来创建两个多项式并将它们相乘:cppint main() {Polynomial poly1, poly2, result;poly1.addTerm(3, 2); // 3x^2 + 4x + 5 的第一个项:3x^2poly1.addTerm(4, 1); // 3x^2 + 4x + 5 的第二个项:4x^1 或4x 或4(取决于你如何表示它)poly1.addTerm(5, 0); // 3x^2 + 4x + 5 的第三个项:5x^0 或5(常数项)poly2.addTerm(2, 3); // 2x^3 + 3x^2 - 1 的第一个项:2x^3 或2(取决于你如何表示它)// 注意这里是一个错误的输入,应为poly2.addTerm(2, 2); 表示x^2 项。
多项式的乘法多项式的乘法是代数学中非常重要的运算之一。
在代数学中,多项式是由一系列的项组成的表达式,每一项都包含了一个系数和一个变量的幂。
多项式的定义我们先来了解一下多项式的定义。
一个多项式可以表示为以下形式:P(x) = a₀ + a₁x + a₂x² + ... + anxn其中,P(x)是多项式的表达式,a₀, a₁, a₂, … ,an是系数,x是变量,n是多项式的阶数。
每一项由系数和变量的幂组成。
系数可以是实数、复数或者其他数域中的元素。
多项式的乘法规则多项式的乘法遵循以下规则:1.两个多项式相乘,等于将每个项相乘后再将结果相加。
2.两个项相乘,得到的结果是系数的乘积和指数的和。
3.乘法运算要注意指数的和并进行合并。
设有两个多项式:P(x) = a₀ + a₁x + a₂x² + ... + anxnQ(x) = b₀ + b₁x + b₂x² + ... + bmxm这两个多项式的乘积为:P(x) * Q(x) = (a₀ * Q(x)) + (a₁x * Q(x)) + (a₂x² * Q(x)) + ... + (a nxn * Q(x))通过按照规则2,我们可以对每一项进行乘法运算,得到新的多项式。
多项式的乘法示例让我们通过一个示例来理解多项式的乘法。
假设有两个多项式:P(x) = 3x² + 2x + 1Q(x) = 2x + 1我们需要计算这两个多项式的乘积。
按照乘法规则,我们先将P(x)的每一项与Q(x)进行乘法运算,然后将结果相加。
P(x) * Q(x) = ((3x² * Q(x)) + (2x * Q(x)) + (1 * Q(x)))按照乘法规则2,我们有:3x² * Q(x) = (3x² * (2x + 1)) = 6x³ + 3x²2x * Q(x) = (2x * (2x + 1)) = 4x² + 2x1 * Q(x) = (1 * (2x + 1)) = 2x + 1将上述结果相加,我们得到最终的乘积多项式:P(x) * Q(x) = (6x³ + 3x²) + (4x² + 2x) + (2x + 1) = 6x³ + 7x² + 4x + 1所以,多项式P(x)和Q(x)的乘积为6x³ + 7x² + 4x + 1。
多项式的乘法法则多项式是数学中非常重要的概念之一,它在代数、数论、几何等领域都扮演着重要角色。
其中,多项式的乘法法则是我们学习和应用多项式的基础,本文就来生动、全面且有指导意义地讲解多项式的乘法法则。
首先,我们需要明确多项式的定义。
多项式是由一系列项相加或相减而得到的表达式,每个项由系数与变量的幂次组成。
例如,3x^2- 2x + 5就是一个多项式,其中的每一项分别是3x^2、-2x和5,它们的系数分别为3、-2和5,而变量的幂次分别为2、1和0。
接下来,我们来讲解多项式的乘法法则。
多项式的乘法法则指导我们如何计算多项式之间的相乘。
具体来说,两个多项式相乘时,我们应该将一个多项式的每一项与另一个多项式的每一项相乘,然后将得到的乘积相加。
下面我们以一个简单的例子来说明。
假设我们要计算多项式(x + 2)和多项式(3x - 1)的乘积。
根据乘法法则,我们将第一个多项式的每一项(x和2)分别与第二个多项式的每一项(3x和-1)相乘,然后将得到的乘积相加。
首先,将x与3x相乘,得到3x^2;再将x与-1相乘,得到-x;然后将2与3x相乘,得到6x;最后将2与-1相乘,得到-2。
将所有的乘积相加,得到最终的乘积为3x^2 - x + 6x - 2。
因此,多项式(x + 2)和多项式(3x - 1)的乘积为3x^2 + 5x - 2。
通过这个简单的例子,我们可以看出多项式的乘法法则的应用是非常直观和简单的。
只需要将一个多项式的每一项与另一个多项式的每一项相乘,然后将得到的乘积相加即可得到最终的乘积。
在实际应用中,多项式的乘法法则可以帮助我们解决各种与多项式相关的问题。
例如,在代数方程、几何图形分析等领域,我们常常需要对多项式进行乘法运算来求解问题,而多项式的乘法法则提供了基本的操作步骤和思路。
总结起来,多项式的乘法法则是数学中重要且实用的工具之一。
通过将一个多项式的每一项与另一个多项式的每一项相乘,并将得到的乘积相加,我们可以计算多项式之间的相乘。
PTA7-1⼀元多项式的乘法与加法运算(Java实现)7-1 ⼀元多项式的乘法与加法运算 (20 分)设计函数分别求两个⼀元多项式的乘积与和。
输⼊格式:输⼊分2⾏,每⾏分别先给出多项式⾮零项的个数,再以指数递降⽅式输⼊⼀个多项式⾮零项系数和指数(绝对值均为不超过1000的整数)。
数字间以空格分隔。
输出格式:输出分2⾏,分别以指数递降⽅式输出乘积多项式以及和多项式⾮零项的系数和指数。
数字间以空格分隔,但结尾不能有多余空格。
零多项式应输出0 0。
输⼊样例:4 3 4 -5 26 1 -2 03 5 20 -74 3 1输出样例:15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 15 20 -4 4 -5 2 9 1 -2 0程序import java.util.*;public class Main {static class Term implements Comparable<Term> {public int a; //系数public int b; //指数public Term(int a, int b) {this.a = a;this.b = b;}public Term() {}@Overridepublic int compareTo(Term newTerm) {return pare(this.b, newTerm.b);}}public static void main(String[] args) {Stack<Term> stack0 = new Stack<>(); //中转栈Stack<Term> stack = new Stack<>(); //式⼦1_乘法栈Stack<Term> stack1 = new Stack<>(); //式⼦2_加法栈Stack<Term> stack2 = new Stack<>(); //式⼦1_乘法栈Queue<Term> queue = new LinkedList<>(); //式⼦2_乘法队列Queue<Term> queue1 = new LinkedList<>(); //乘法结果Queue<Term> queue2 = new LinkedList<>(); //加法结果ArrayList<Term> mul = new ArrayList<>();ArrayList<Term> addTerm = new ArrayList<>();Scanner in = new Scanner(System.in);int n1 = in.nextInt();for (int i = 0; i < n1; i++) {Term term = new Term(in.nextInt(), in.nextInt());stack2.push(term);stack0.push(term);}while (stack0.empty() == false) {stack.push(stack0.pop());}int n2 = in.nextInt();for (int i = 0; i < n2; i++) {Term term = new Term(in.nextInt(), in.nextInt());queue.offer(term); //插⼊队列stack0.push(term);}while (stack0.empty() == false) {stack1.push(stack0.pop());}int flag = n2;/*** 乘法:将式⼦1的各项保存在栈stack2中,将式⼦2的各项保存在队列queue中,让stack中的各项与queue中的各项相乘,结果保存在queue1中,* 同时将queue1中的该项移到队尾,stack2中的该项出栈,知道stack2为空时,乘法运算完成。
天津城市建设学院课程设计任务书2010—2011学年第1学期电子与信息工程系计算机科学与技术专业班级课程设计名称:数据结构课程设计设计题目:一元多项式乘法完成期限:自2012 年 1 月 2 日至2012 年 1 月 6 日共 1 周一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;(4)认真编写课程设计报告。
三、设计内容一元多项式乘法1) 问题描述已知A(x)=a0+a1x+a2x2+……+a n x n和B(x)=b0+b1x+b2x2+……+b m x m,并且在A(x)和B(x)中指数相差很多,求A(x)=A(x)*B(x)。
2) 基本要求(1)设计存储结构表示一元多项式;(2)设计算法实现一元多项式乘法;(3)分析算法的时间复杂度和空间复杂度。
四、参考文献1.王红梅.数据结构.清华大学出版社2.王红梅.数据结构学习辅导与实验指导.清华大学出版社3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社目录一、需求分析 (4)二、总体设计 (4)三、详细设计 (4)四、调试与测试 (5)五、关键源程序清单和执行结果 (5)六、感想与体会 (14)一、需求分析(1)、程序功能:输入两个一元多项式,求出两个多项式的乘积。
(2)、输入输出要求:①输入多项式因子的系数和指数,保存多项式时,按指数递增的顺序;②输出结果也是按指数递增的顺序。
二、总体设计开始系数输入两个一元多项式指数多项式相乘输出多项式的乘积结束程序设计流程图三、详细设计采用结构体存储多项式因子struct PolynomialFactor参数:float exp;//系数int coef;//指数方法:PolynomialFactor();PolynomialFactor(float exp,int coef);//通过比较多项式因子的指数重载。
使得多项式可以按指数大小排序bool operator<(PolynomialFactor factor);//比较两个多项式因子的指数是否相同使指数相同的多项式因子能够合并。
bool operator==(PolynomialFactor factor);//重载*号使得多项式乘法显得更人性化PolynomialFactor operator*(PolynomialFactor factor);//能够直接输入多项式因子friend ostream& operator<<(ostream &output,PolynomialFactor factor);采用类和单链表存储多项式class Polynomial方法:Polynomial(void);Polynomial(int length,PolynomialFactor *factor);~Polynomial(void);Polynomial operator*(Polynomial polynomial);Polynomial operator+(Polynomial polynomial);friend ostream& operator<<(ostream &output,Polynomial polynomial);//往多项式里添加多项式因子void Add(PolynomialFactor factor);四、调试与测试在程序中使用的排序算法是在添加因子到多项式中时就进行排序,使多项式因子的指数递增,这就要求在算法中要添加一个合并程序使相同的指数的项合并为一项。
例如,多项式2x^2+4x^3+3x^1-7 与多项式 2x^3+3x^5+6 相乘就会有指数相同项,输出结果为-42x^0+18x^1+12x^2+10x^3+6x^4-17x^5+17x^6+6x^7+12x^8.五、关键源程序清单和执行结果源程序:LinkList.h:#ifndef LinkList_H#define LinkList_Htemplate <class T>struct Node{T data;Node<T> *next;};template <class T>class LinkList{public:LinkList( ); //建立只有头节点的空链表LinkList(T a[ ], int n); //建立有n个元素的单链表~LinkList(); //析构函数int Length(); //求单链表的长度T Get(int i); //去单链表中第i个结点的元素值int Locate(T x); //求单链表中值为x的元素序号void Update(int i,T x); //将第i个结点的值修改为xvoid Insert(int i, T x); //在单链表中第i个位置插入值为x的结点T Delete(int i); //在单链表中删除地i个结点void PrintList( ); //遍历单链表按序号输出各个元素void Reverse(); //单链表逆置void Clear();private:Node<T> *first; //单链表头指针};#endiftemplate <class T>LinkList<T>:: LinkList( ){first=new Node<T>; first->next=NULL;}template <class T>LinkList<T>:: LinkList(T a[ ], int n){first=new Node<T>; //生成头节点Node<T> *r,*s;r=first; //尾指针初始化for (int i=0; i<n; i++){s=new Node<T>; s->data=a[i]; //为每个数组元素建立节点r->next=s; r=s; //插入到终端结点之后}r->next=NULL; //单链表建立完毕,将终端结点指针域置空}template <class T>LinkList<T>:: ~LinkList(){}template <class T>T LinkList<T>::Get(int i){Node<T> *p;int j;p=first->next;j=1;while (p && j<i){p=p->next;j++;}if (!p) throw"位置";else return p->data;}template <class T>int LinkList<T>::Locate(T x){Node<T> *p; int j;p=first->next; j=1;if(p&&p->next){while(p->data!=x){p=p->next;j++;}return j;}else throw"位置";}template<class T>void LinkList<T>::Insert(int i, T x){Node<T> *p; int j;p=first ; j=0;while(p && j<i-1){p=p->next;++j;}if (!p) throw"位置";else {Node<T> *s;s=new Node<T>;s->data=x; //向内存申请一个节点s,值为xs->next=p->next; //将结点s插入到结点p之后p->next=s;}}template <class T>int LinkList<T>::Length( ){Node <T> *p = first->next;int i = 0;while(p){p = p->next;i++;}return i;}template <class T>T LinkList<T>::Delete(int i){Node<T> *p; int j;p=first ; j=0; //工作指针p初始化while (p && j<i-1) //查找第i-1个结点{p=p->next;j++;}if (!p || !p->next) throw"位置"; //点p不存在或点p后继结点不存在else {Node<T> *q;T x;q=p->next;x=q->data; //暂存被删结点p->next=q->next; //摘链delete q;return x;}}template <class T>void LinkList<T>::PrintList( ){Node<T> *p;p=first->next;while (p){cout<<p->data<<endl;p=p->next;}}template <class T>void LinkList<T>::Reverse(){Node <T> *p,*u;p=first->next;first->next=NULL;while(p){u=p->next;p->next=first->next;first->next=p;p=u;}}template <class T>void LinkList<T>::Update(int i,T x) {Node<T> *p; int j;p=first ; j=0;while (p && j<i-1){p=p->next;j++;}if(p&&p->next)p->next->data=x;else throw("位置");}template <class T>void LinkList<T>::Clear(){Node<T> *p=this->first->next;Node<T> *q =NULL;this->first->next=NULL;while(NULL!=p){q=p;p=p->next;delete q;}}Polynomial.h:#pragma once#include"LinkList.h"#include<iostream>using namespace std;struct PolynomialFactor{float exp;//系数int coef;//指数PolynomialFactor();PolynomialFactor(float exp,int coef);bool operator<(PolynomialFactor factor);bool operator==(PolynomialFactor factor);PolynomialFactor operator*(PolynomialFactor factor);friend ostream& operator<<(ostream &output,PolynomialFactor factor); };class Polynomial{public:Polynomial(void);Polynomial(int length,PolynomialFactor *factor);~Polynomial(void);Polynomial operator*(Polynomial polynomial);Polynomial operator+(Polynomial polynomial);friend ostream& operator<<(ostream &output,Polynomial polynomial);//添加多项式因子,若存在指数相同的因子,将系数相加,若系数=0则删除//若不存在,插入到合适的位置,使多项式因子的指数递增void Add(PolynomialFactor factor);private:LinkList<PolynomialFactor> factors;};Polynomial.cpp:#include"StdAfx.h"#include"Polynomial.h"//PolynomialFactor的成员PolynomialFactor::PolynomialFactor(){}PolynomialFactor::PolynomialFactor(float exp,int coef){this->exp=exp;this->coef=coef;}bool PolynomialFactor::operator<(PolynomialFactor factor){return this->coef<factor.coef;}PolynomialFactor PolynomialFactor::operator*(PolynomialFactor factor) {return PolynomialFactor(this->exp*factor.exp,this->coef+factor.coef); }bool PolynomialFactor::operator==(PolynomialFactor factor){return this->coef ==factor.coef;}//Polynomial的成员Polynomial::Polynomial(void){}Polynomial::~Polynomial(void){}Polynomial::Polynomial(int length,PolynomialFactor *factor){for(int i=0;i<length;++i){this->Add(factor[i]);}}Polynomial Polynomial::operator*(Polynomial polynomial){int length1=this->factors.Length(),length2=polynomial.factors.Length();//Polynomial result;for(int i=0;i<length1;++i){for(int j=0;j<length2;++j){result.Add(this->factors.Get(i+1)*polynomial.factors.Get(j+1));}}return result;}Polynomial Polynomial::operator+(Polynomial polynomial){Polynomial result;for(int i=0;i<polynomial.factors.Length();++i){result.Add(polynomial.factors.Get(i+1));}for(int i=0;i<this->factors.Length();++i){result.Add(this->factors.Get(i+1));}return result;}void Polynomial::Add(PolynomialFactor factor){if(0==this->factors.Length()){this->factors.Insert(1,factor);return;}PolynomialFactor temp;for(int i=0;i<this->factors.Length();){if(factor<this->factors.Get(i+1)){this->factors.Insert(i+1,factor);return;}else if(factor==(temp=this->factors.Get(i+1))){if(0==factor.exp+temp.exp)this->factors.Delete(i+1);else{this->factors.Update(i+1,PolynomialFactor(factor.exp+temp.exp,factor.coef));}return;}else++i;}this->factors.Insert(this->factors.Length()+1,factor);}ostream& operator<<(ostream &output,PolynomialFactor factor){output<<factor.exp<<"x^"<<factor.coef;return output;}ostream& operator<<(ostream &output,Polynomial polynomial){output<<"("<<polynomial.factors.Get(1);for(int i=1;i< polynomial.factors.Length();++i){cout<<"+"<<polynomial.factors.Get(i+1);}cout<<")";return output;}PolynomialMul.cpp:#include"stdafx.h"#include"Polynomial.h"#include<iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){PolynomialFactor factor;Polynomial polynomial1,polynomial2;int num1,num2;cout<<"请输入第一个多项式的因子个数 \n";cin>>num1;for(int i=0;i<num1;++i){cout<<"请输入第"<<i+1<<"个因子的系数和指数\n";cin>>factor.exp>>factor.coef;polynomial1.Add(factor);}cout<<"请输入第二个多项式的因子个数 \n";cin>>num2;for(int i=0;i<num2;++i){cout<<"请输入第"<<i+1<<"个因子的系数和指数\n";cin>>factor.exp>>factor.coef;polynomial2.Add(factor);}cout<<polynomial1<<"与"<<polynomial2<<"的乘积为:"<<polynomial1*polynomial2<<endl;return 0;}运行结果:六、感想与体会通过这次数据结构的课程设计我知道了自己对于数据结构的知识掌握的不是很多,而且,我了解到数据结构的知识对于编程是多么重要。