【数据结构】多项式的运算
题意理解
已知两个多项式:
(1)\(3x^4-5x^2+6x-2\)
(2)\(5x^{20}-7x^4+3x\)
多项式和:
\(5x^{20}-4x^4-5x^2+9x-2\)
多项式乘积:
\((a+b)(c+d)=ac+ad+bc+bd\)
略
输入样例:
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
求解思路
- 多项式表示 //首先是明确使用的数据结构
- 程序框架 //对程序整体有一个规划,下面的四步就是读入、加、乘、输出
- 读多项式
- 加法实现
- 乘法实现
- 多项式输出
理解起来也好理解呀。有明确的步骤,做起事来才不慌啊。
多项式的表示
仅表示非零项
数组:
变成简单、调试容易;需要实现确定数组大小
链表:
动态性强;编程略复杂、调试比较困难
可以使用动态数组来实现 因为已经告诉了有多少项
数据结构设计
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
};
程序框架搭建
int main(){
读入多项式1
读入多项式2
乘法运算并输出
加法运算并输出
return 0;
}
需要设计的函数:
读入
相乘
相加
输出
int main(){
Polynomial P1,P2,PP,PS;
P1=ReadPoly();
p2=ReadPoly();
PP=Mult(P1,P2);
PrintPoly(PP);
PS=Add(P1,P2);
printPoly(PS);
return 0;
}
如何读入多项式
Polynomial ReadPoly(){
Polynomial P, Rear,t;
int c,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(struct PolyNode));//弄一个节点放在最前面,使得操作更具有一致性
P->link=NULL;
while(N--){
scanf("%d %d",&c,&d);
Attcah(c,e,&Rear);
}
t=P;p-P->link;free(t); //将多申请的节点去掉
return P;
}
Rear初值是多少
- Rear初值为NULL
- Rear指向一个空节点(推荐,一致性比较强)
void Attach(int c,int e, Polynomial *pRear){
Polynomial P;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->coef=c;
P->expon=e;
P->link=NULL;
(*pRear)->link=P;
*pRear=P;
}
Polynomial Add(Polynomial P1,Polynomial P2){
Polynomial t1=P1,t2=P2;
Polynomial Rear,P=(Polynomial)malloc(sizeof(struct PolyNode)),t;
P->Next=NULL;
Rear = P;
while(t1&&t2){
if(t1->expon==t2->expon){
Attach(t1->coef+t2->coef, t1->expon, &Rear);
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;
}
}
while(t1){
Attach(t1->coef, t1->expon, &Rear);
t1=t1->Next;
}
while (t2) {
Attach(t2->coef, t2->expon, &Rear);
t2=t2->Next;
}
t=P;P=P->Next;free(t);
return P;
};
void PrintPoly(Polynomial P){
Polynomial t=P;
int first =1;
while(t){
if(first==1){
printf("%d %d",t->coef,t->expon);
first=0;
t=t->Next;
}else{
printf(" %d %d",t->coef,t->expon);
t=t->Next;
}
}
};