一元多项式的乘法与加法运算

一元多项式的乘法与加法运算

1.实验目的

熟练掌握链式线性表的基本操作,以及在多项式运算上的应用。

2.实验内容

设计函数分别求两个一元多项式的乘积与和。

3.实验要求

(1)输人说明:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

(2)输出说明:输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。 数字间以空格分隔,但结尾不能有多余空格。

(3)测试用例:

序号

输入

输出

说明

1

4 3 4  -5 2 6 1 -2 0

3 5 20 -7 4  3 1

15 24  -25 22 30 21  -10 20

-21 8 35 6 -33 5 14 4 -15 3

18 2 -6 1

5 20 -4 4 -5 2 9 1 -2 0

一般情况

2

2 1 2 1 0

2 1 2 -1 0

1 4 -1 0

2 2

同类项合并时有抵消

3

2 -1000 1000 1000 0

2 1000 1000 -1000 0

-1000000 2000 2000000 1000

-1000000 0

0 0

系数和指数取上限,结果有零多项式

4

0

1 999 1000

0 0

999 1000

输入有零多项式和常数多项式

输入格式:

 

4.解决思路

(1)问题分析

由于多项式可能非常稀疏,所以宜采用链式线性表表示,仅存储非零项。又由于题目不仅要求计算乘积,还要求计算和式,所以在计算中不能破坏原始输入的两个多项式,需要建立新的链表存储结果多项式。

多项式的加法运算很简单,只要逐项比较两多项式的非零项,将指数较大的项加到结果多项式的末尾即可。这里要注意指数相同的项相加后系数为零的情况,以及零多项式的特殊处理。

对于两个多项式P1和P2相乘,可有两种求解思路:

①利用多项式的加法运算,即将多项式P2的每一项分别与P1多项式相乘,其结果也是一个多项式。应用多项式的加法运算,逐步将这些多项式累加,就可获得结果。

②直接运算,逐项插入。将多项式P2的每一项分别与P1各项相乘,将所乘形成的新项插人到中间结果多项式中。该中间结果多项式一开始为空,并以指数递减的顺序维持当前的运算中间状态。当有新项需要插人时,相当于在一个递减链表中插入一个新结点,并维持递减顺序。如果插入的新结点的指数与链表中某结点的指数一样,则将其系数相加;如果系数相加后的结果为零,则从中间结果链表中删除相应结点,否则就更改链表中系数值;如果不存在指数相同结点,则将新结点插入到相应位置。

(2)实现要点

不管是采用上述哪种方法,都需要使用一个链表P表示当前运算的中间状态(也是一个多项式),P一开始是空的。 如果直接使用多项式加法运算,则每次将P2的某项与Pl相乘的结果生成一个新多项式TmpP,然后将TmpP加到P中,使P保持目前的运算结果。如果采用直接插入各项的方法,则是将P2的某项与P1的某项相乘的结果(系数相乘,指数相加),按顺序插入到P中。

注意:采用模块化编程,将求和函数与求乘积函数分别实现,会带来很大方便。

5.实验思考题

本题以链表的方式表示多项式,读者可以改用数组的方式实现相应的多项式乘法与加法运算。

参考示例

1、多项式链表结点定义

typedef struct Node{

    int coef;       //系数

    int expon;      //指数

    struct Node *link;     //指向下一个节点的指针

}PolyNode;

typedef PolyNode *PtrToNode; //指向节点的指针

typedef PolyNode *Polynomial; //多项式

2、void Attach(int c, int e, PtrToNode *pRear);

函数功能:在结果表达式最后插入一个新的结点。共三个参数传入,第一个参数c为新结点的系数,第二个参数e为新结点的指数,第三个参数为节点指针的地点,该指针指向结果表达式的最后一个结点。

3Polynomial GetPoly();

函数功能:从标准输入中获得多项式可以把输入独立成一个函数,当输入一个新的多项式时可以直接调用,也可将该部分操作放在main函数中。

4void DisplayPoly(Polynomial p);

函数功能:将结果表达式进行输出。可以把输出独立成一个函数,当输出多项式时可以直接调用,也可将该部分操作放在main函数中。

5Polynomial PolyAdd(Polynomial p1, Polynomial p2);

函数功能:多项式加法

6、Polynomial PolyMulti(Polynomial p1,Polynomial p2);

函数功能:多项式乘法

 

7void DestroyList(Polynomial p);

函数功能:销毁存储多项式的链表空间,在进行多项式乘法的过程中,会借助链表存储运算的中间结果(即中间结果多项式),当计算出运算结果后,可将中间结果多项式删除。

  1. 数据结构及相关函数说明

                         

                                            图1-1链表结点结构体的定义代码

此代码定义了链表结点的结构体Node,该结构体内定义了两整型分别表示多项式的系数(coef)、指数(expon),还有一个结构体指针link指向下一个链表结点;然后定义的指向结点的指针变量,和指向多项式的指针变量。

 

                     图1-2 是Attach函数的代码

Attach函数的作用是给链表插入新的结点,三个参数传入,第一个参数c为新结点的系数,第二个参数e为新结点的指数,第三个参数为节点指针的地点,该指针指向结果表达式的最后一个结点,通过第三个参数,找到新节点插入的位置,将传入传系数,指数赋值给新节点的coef、expon;然后让链表的最后一个结点的link为NULL。将新的连赋值给指针节点指针。

                            图1-3 GetPoly函数的代码

GetPoly函数是从控制台获取多项式的系数和指数的函数,先获取第一个整数(多项式的个数),该整数不能位0或负数,否则返回NULL;然后开辟一个链表头为空结点,建立空表头是为了有一个地址传入Attach来建立链表,然后用while循环来获取控制台的数据,用Attach函数来建立新的结点并插入当前的链表。然后用free函数释放掉空表头,并返回链表。

 

                         图1-4 PolyAdd函数代码

PolyAdd函数是两个多项式的加分运算代码,他需要传两个参数,分别是p1和p2,这两参数是指向多项式的指针;创建一个新的表头,为了调用Attach的时候有地址空间可以用;然后用while循环(循环条件是p1和p2都不为空)进行判断两个多项式各项的指大小,做出不同的操作;为了保障形成的链表中是按照指数从大到小来排列的,所以需要对多项式各项的指数进行比较,比较厚进行该操作:谁指数大先传谁进Attach函数成为新节点,相同系数相加后再传,传后链表末尾结点的link移一位 。当p1和p2有一个多项式的相加完后也就是p2->link或p1->link为NULL时;将剩下多项式的项用while循环一个一个都复制到新的链表末尾。然后让结果多项式的的尾项指针的link为NULL,最后让head指向结果多项式的第一个非空项 , 释放空结构 。

  

                              图1-5 PolyMulti函数

PolyMulti函数是将两个多项式相乘的函数;也是需要传入两多项式,判断多项式是否为空;创建一个新的表头,为了调用Attach的时候有地址空间可以用;通过循环将t1多项式的第一项分别乘以t2多项式的每一项;调用Attach形成一个初始链表,作用:因为下面的双层whil循环是包含一项比较指数的代码的,所以先创建一个多项式链表给下面的代码作为比对指数大小的;然后让t1多项式指向第二项,然后通过双层while循环用t1多项式的第二项之后的每一项来乘以t2的每一项;为了是形成的链表按照指数从大到小排列,通过while循环来比较已有链表中的expon是否比即将插入的e大, 如果大就一直循环下去,直到找到比即将插入的e小或者Rear->link为null ;然后就是判断即将插入的指数和链表中已存在的指数是否一样,一样的话就要合并同类项,系数相加;如果同类项合并后系数是否不为0;就将系数更改,为0就删掉结点;如果即将插入的指数在链表已有的指数中没有相同的,且找到了该插入的位置,给插入的数据申请空间,给新申请的结点赋值,进行链表插入操作,将结点插入链表,最后释放一开始建立的链表头空结点。

                 图1-6  DisplayPoly函数代码

该函数是将最后的处理过的链表进行打印输出,用了一个while循环,当p不为空时,就一直循环,每输出两个数之间会输出一个空格,这里用一个f作为旗帜的,当f为1是输出空格,每次循环都会让f在0和1之间转变。然后当系数c为0是什么都不输出。

 

                图1-7 main代码

在主函数中定义了是个Polynomial类型的变量,其中p1,p1表示两个多项式;pp用来接收PolyMulti函数返回的链表,然后传入DisplayPoly进行链表打印,ps用来接收PolyAdd函数返回的链表,然后传入DisplayPoly进行链表打印。

  1. 实验结果抓图

                          图2-1 一般情况

一般情况输入的案例t1:4个项 3 4  -5 2 6 1 -2 0  t2;3个项 5 20 -7 4  3 1

通过两个多项式相加的输出为:5 20 -4 4 -5 2 9 1 -2 0

两个多项式加法运算是先通过 GetPoly函数分别获取控制台的t1和t2的数据,并调用Attach函数将数据存储在两个链表中,然后调用PolyAdd函数将两链表中的每一项相加合并到一个新的链表中,并且要按照指数从高到底排列的,最后调用DisplayPoly进行结果打印。

通过两个多项式相乘的输出为:15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1

两个多项式乘法运算是先通过 GetPoly函数分别获取控制台的t1和t2的数据,并调用Attach函数将数据存储在两个链表中,然后调用PolyMulti函数进行乘法运算然后合并到一个新的链表中成为一个新的多项式;并且要按照指数从高到底排列的,最后调用DisplayPoly进行结果打印。

                   图2-2 同类项合并时有抵消

有同类项合并是抵消掉一些项的情况是在一般情况下,在多项式相加或相乘时判断了相加或相乘项的指数和系数;当两项相加是指数相同就可以进行系数相加,系数相加后系数为0即可将该项结点释放掉。相乘时相乘后可以合并同类项的项合并后系数为0也可以释放该项的结点,最后调用DisplayPoly进行结果打印。

                        图2-3 系数和指数取上限,结果有零多项式

当系数和指数取上限,结果有零多项式这种情况时;我采用的是在输出链表函数DisplayPoly定义一个旗帜g;当g=0是就输出“0  0”,每次输出都会让g在0和1之间变化。

                    图 2-4输入有零多项式和常数多项式

当是输入有零多项式和常数多项式这种情况是在GetPoly函数做一个判断当输入第一个数为0是就让链表为空,然后在DisplayPoly函数做判断,当链表为空是就输出“0  0”。

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panpoo*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值