7-9 求两个一元多项式的和 (10分)
求两个一元多项式的和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分1行,分别以指数递降方式输出和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例1:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例1:
5 20 -4 4 -5 2 9 1 -2 0
正解:
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define OVERFLOW 0
typedef struct PNode
{
int coef; //系数
int expn; //指数
struct PNode *next;
} PNode,*PolyNomial;
void CreatePolyn(PolyNomial &P,int n);
void Printf(PolyNomial &P);
void AddPolyn(PolyNomial &Pa,PolyNomial &Pb);
void CreatePolyn(PolyNomial &P,int n)
{
//输入n项的系数和指数,建立表示多项式的有序链表P
P=new PNode;
P->next=NULL;
for(int i=1; i<=n; i++)
{
PolyNomial s=new PNode;
scanf("%d %d",&s->coef,&s->expn);
PolyNomial pre=P;
PolyNomial q=P->next;
while(q&&q->expn > s->expn) //通过比较指数找到第一个大于输入项指数的项*q
{
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
void Printf(PolyNomial &P)
{
int flag=0;
P=P->next;
if(!P) //零多项式应输出0 0。
{
printf("0 0\n");
return;
}
while(P)
{
if(flag)
{
printf(" ");
}
flag=1;
printf("%d ",P->coef);
printf("%d",P->expn);
P=P->next;
}
printf("\n");
}
void AddPolyn(PolyNomial &Pa,PolyNomial &Pb)
{
//多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成“和多项式”
PolyNomial p1,p2,p3,r;
p1=Pa->next;
p2=Pb->next;
p3=Pa;
while(p1&&p2)
{
if(p1->expn == p2->expn) //指数相等
{
int sum=p1->coef+p2->coef;
if(sum!=0)
{
p1->coef=sum;
p3->next=p1;
p3=p1;
p1=p1->next;
r=p2;
p2=p2->next;
delete r;
}
else
{
r=p1;
p1=p1->next;
delete r;
r=p2;
p2=p2->next;
delete r;
}
}
else if(p1->expn > p2->expn) //Pa当前结点的指数值小
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else //Pa当前结点的
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
p3->next = p1 ? p1 : p2;
delete Pb;
}
int main()
{
PolyNomial LA,LB;
int m,n;
scanf("%d",&n);
CreatePolyn(LA,n);
scanf("%d",&m);
CreatePolyn(LB,m);
AddPolyn(LA,LB);
Printf(LA);
return 0;
}