PTA7-2 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
AC代码(看起来很多其实不难):
#include<stdio.h>
#include<stdlib.h>
typedef struct PolyNode* Polynomial;
struct PolyNode
{
int coef;
int expon;
Polynomial next;
};
typedef Polynomial pol;
//函数声明
pol ReadPoly();
pol Mult(pol P1,pol P2);
pol Add(pol P1,pol P2);
void PrintPoly(pol PP);
int main()//程序框架
{
pol P1,P2,PP,PS;
P1=ReadPoly();
P2=ReadPoly();
PP=Mult(P1,P2);
PrintPoly(PP);
PS=Add(P1,P2);
PrintPoly(PS);
return 0;
}
//对Rear指针的处理:1.初始值为NULL,根据是否为空做不同处理;2.指向一个空结点
//*pRear当前结果表达式尾项指针的指针
//函数实现在pRear后面插入节点
void Attach(int c,int e,pol *pRear)
{
pol P;
P=(pol)malloc(sizeof(struct PolyNode));
P->coef=c;
P->expon=e;
P->next=NULL;
(*pRear)->next=P;
*pRear=P;
}
pol ReadPoly()
{
pol P,Rear,t;
int c,e,N;
scanf("%d",&N);
P=(pol)malloc(sizeof(struct PolyNode));//链表空头结点
P->next=NULL;
Rear=P;
while(N--)
{
scanf("%d %d",&c,&e);
if(c!=0)
Attach(c,e,&Rear);//将当前项插入多项式尾部
}
t=P;
P=P->next;
free(t);//删除前面临时生成的头结点
return P;
}
pol Add(pol P1,pol P2)
{
pol t1,t2;
t1=P1;
t2=P2;
//生成新的头结点
pol P;
pol t;
P=(pol)malloc(sizeof(struct PolyNode));
P->next=NULL;
pol Rear;
Rear=P;
while(t1&&t2)
{
if(t1->expon==t2->expon)
{
if(t1->coef+t2->coef)//系数为0时不添加到尾结点上
{
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;
}
//多项式乘法方法:
//1.将乘法运算转换为加法运算,让P1的每一项和P2相乘,在加到结果多项式中
//2.逐项插入,将P1当前项乘P2当前项,在插入到结果表达式中,关键是找到插入的位置
pol Mult(pol P1,pol P2)
{
pol P,Rear;
pol t1,t2,t;
if(!P1||!P2)//P1,P2,有一个空则为空
{
return NULL;
}
t1=P1;
t2=P2;
P=(pol)malloc(sizeof(struct PolyNode));
Rear=P;
while(t2)
{
//先用P1的第一项乘以P2,得到初始结果多项式
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)
{
int e,c;
e=t1->expon+t2->expon;
c=t1->coef*t2->coef;//后面每一项的相乘结果
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;
}
else//为0则删除该结点
{
t=Rear->next;
Rear->next=t->next;
free(t);
}
}
else//插入位置
{
t=(pol)malloc(sizeof(struct PolyNode));
t->coef=c;
t->expon=e;
t->next=Rear->next;
Rear->next=t;
Rear=Rear->next;
}
t2=t2->next;
}
t1=t1->next;
}
t2=P;
P=P->next;
free(t2);
return P;
}
void PrintPoly(pol P)
{
int flag=0;
if(!P)
{
printf("0 0\n");
return;
}
while(P)
{
if(!flag)//第一次
{
flag=1;
}
else
{
printf(" ");
}
printf("%d %d",P->coef,P->expon);
P=P->next;
}
printf("\n");
}
有问题欢迎在下方留言!