1-1 一元多项式的乘法与加法运算 (25分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
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
思路如下:
配合👇视频食用更佳
中国大学MOOC 数据结构 小白专场:一元多项式的乘法与加法运算
多项式的表示
对数据的存储
由于事先不知道多项式有几项,所以不建议使用数组,避免造成空间的浪费。链表的动态性强但编程略为复杂、调试比较困难。本题较好的实现方法是使用:动态数组(vector)
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef,expon; //系数,指数
Polynomial next;
};
程序框架搭建
对数据的操作
int main(){
读入多项式1
读入多项式2
乘法运算并输出
加法运算并输出
return 0;
}
代码如下:
链表实现
#include<bits/stdc++.h>
using namespace std;
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef,expon; //系数,指数
Polynomial next;
};
void Attach(int c,int e,Polynomial *Prear){ //构造新结点,插到当前结果表达式后面
Polynomial P = new PolyNode();
P->coef = c,P->expon = e;P->next = NULL;
(*Prear)->next = P;
*Prear = P; //修改P值
}
Polynomial ReadPoly(){
Polynomial P,Rear,tmp;
int c,e,n;
P = new PolyNode();P->next = NULL; //临时申请链表头空结点
Rear = P; //构造新结点并让rear指向空结点,这样attach函数不用判断rear是否为NULL
cin >> n;
while(n--){
cin >> c >> e;
Attach(c,e,&Rear); //因为按指数递减的顺序读入,所以将当前结点插入多项式尾部
}
tmp = P;P=P->next;free(tmp); //删除临时生成的头结点
return P;
}
void PrintPoly(Polynomial P){
int flag = 0;
if(!P){
cout << 0 <<" " <<0 << endl;
return;
}
while(P){ //链表遍历基本框架
if(!flag) flag = 1;
else cout << " ";
cout << P->coef <<" "<<P->expon;
P = P->next;
}
cout << endl;
}
Polynomial AddPoly(Polynomial P1,Polynomial P2){
Polynomial t1 = P1,t2 = P2,P,Rear,tmp;
P = new PolyNode();P->next = NULL;
Rear = P;
while(t1&&t2){
if(t1->expon==t2->expon){
if(t1->coef+t2->coef) Attach(t1->coef+t2->coef,t1->expon,&Rear); //要判断系数之和是否为0
t1=t1->next;t2=t2->next;
}else if(t1->expon>t2->expon){
Attach(t1->coef,t1->expon,&Rear);
t1=t1->next;
}else{
Attach(t2->coef,t2->expon,&Rear);
t2=t2->next;
}
}
Rear->next = t1?t1:t2; //等价于两个while循环判断t1/t2是否为空,若空一个一个把结点插到rear后面
tmp = P;P=P->next;free(tmp);
return P;
}
Polynomial MultPoly(Polynomial P1,Polynomial P2){
Polynomial P,Rear,tmp,t1=P1,t2=P2;
int c,e;
if(!P1||!P2) return NULL;
P = new PolyNode();P->next = NULL;
Rear = P;
while(t2){ //构造初始多项式 用P1的第一项×P2得到P
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2 = t2->next;
}
t1=t1->next;
while(t1){
t2 = P2;Rear = P; //每次让rear指向结果多项式第一项
while(t2){
c = t1->coef*t2->coef;
e = t1->expon+t2->expon;
while(Rear->next&&Rear->next->expon>e) Rear=Rear->next; //找到新的一项要插入的地方
if(Rear->next&&Rear->next->expon==e){
if(Rear->next->coef+c) Rear->next->coef+=c; //要判断系数之和是否为0
else{ //系数为0把结点删掉
tmp = Rear->next;
Rear->next = tmp->next;
free(tmp);
}
}else{ //指数若不存在于原结果多项式 申请新结点并插入
tmp = new PolyNode();
tmp->coef = c,tmp->expon = e;
tmp->next = Rear->next;
Rear->next = tmp;
Rear = Rear->next;
}
t2=t2->next;
}
t1=t1->next;
}
t2=P;P=P->next;free(t2);
return P;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
Polynomial P1,P2,PA,PM;
P1 = ReadPoly();
P2 = ReadPoly();
PM = MultPoly(P1,P2);
PrintPoly(PM);
PA = AddPoly(P1,P2);
PrintPoly(PA);
return 0;
}