题目:https://pintia.cn/problem-sets/15/problems/710
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
代码:未提交OJ
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int Coef;
int Expon;
struct LNode *Next;
}LNode, *LinkList;
LinkList ReadPoly(void);
LinkList Mult(LinkList La, LinkList Lb);
LinkList Add(LinkList La, LinkList Lb);
void PrintPoly(LinkList L);
int main()
{
LinkList La, Lb, mult, add;
La = ReadPoly();
Lb = ReadPoly();
mult = Mult(La, Lb);
add = Add(La, Lb);
PrintPoly(mult);
printf("\n");
PrintPoly(add);
return 0;
}
LinkList ReadPoly(void){
int N, coef, expon;
LinkList L, rear, temp;
L = (LinkList)malloc(sizeof(LNode));
if(!L)
exit(1);
L ->Next = NULL;
rear = L;
scanf("%d", &N);
while(N--){
scanf("%d%d", &coef, &expon);
temp = (LinkList)malloc(sizeof(LNode));
if(!temp)
exit(1);
temp->Coef = coef;
temp->Expon = expon;
temp->Next = NULL;
rear->Next = temp;
rear = rear->Next;
}
//rear->Next = NULL;
return L;
}
LinkList Mult(LinkList La, LinkList Lb){
LinkList L, pa, pb, temp, rear;
int coefMult, exponAdd;
L = (LinkList)malloc(sizeof(LNode));
if(!L)
exit(1);
L->Next = NULL;
rear = L;
pa = La->Next;
pb = Lb->Next;
if(!pa || !pb)
return L;
while(pb){
temp = (LinkList)malloc(sizeof(LNode));
if(!temp)
exit(1);
temp->Next = NULL;
temp->Coef = pa->Coef * pb->Coef;
temp->Expon = pa->Expon + pb->Expon;
rear->Next = temp;
rear = rear->Next;
pb = pb->Next;
}
pa = pa->Next;
while(pa){
pb = Lb->Next;
rear = L;
while(pb){
coefMult = pa->Coef * pb->Coef;
exponAdd = pa->Expon + pb->Expon;
while(rear->Next && rear->Next->Expon > exponAdd){
rear = rear->Next;
}
if(rear->Next && rear->Next->Expon==exponAdd){
if(rear->Next->Coef + coefMult){
rear->Next->Coef += coefMult;
}
else{
temp = rear->Next;
rear->Next = temp->Next;
free(temp);
}
}
else{
temp = (LinkList)malloc(sizeof(LNode));
temp->Coef = coefMult;
temp->Expon = exponAdd;
temp->Next = rear->Next;
rear->Next = temp;
rear = rear->Next;
}
pb = pb->Next;
} /* while(pb) */
pa = pa->Next;
} /* while(pa) */
return L;
}
LinkList Add(LinkList La, LinkList Lb){
LinkList L, pa, pb, rear, temp;
L = (LinkList)malloc(sizeof(LNode));
L->Next = NULL;
rear = L;
pa = La->Next;
pb = Lb->Next;
if(!pa&&!pb)
return L;
while(pa&&pb){
if(pa->Expon==pb->Expon && pa->Coef+pb->Coef==0){
pa= pa->Next;
pb = pb->Next;
continue;
}
temp = (LinkList)malloc(sizeof(LNode));
temp->Next = NULL;
if(pa->Expon > pb->Expon){
temp->Coef = pa->Coef;
temp->Expon = pa->Expon;
pa = pa->Next;
}
else if(pa->Expon == pb->Expon){
temp->Coef = pa->Coef + pb->Coef;
temp->Expon = pa->Expon;
pa = pa->Next;
pb = pb->Next;
}
else{
temp->Coef = pb->Coef;
temp->Expon = pb->Expon;
pb = pb->Next;
}
rear->Next = temp;
rear = rear->Next;
}
if(pb)
pa = pb;
while(pa){
temp = (LinkList)malloc(sizeof(LNode));
if(!temp)
exit(1);
temp->Next = NULL;
temp->Coef = pa->Coef;
temp->Expon = pa->Expon;
rear->Next = temp;
rear = rear->Next;
pa = pa->Next;
}
return L;
}
void PrintPoly(LinkList L){
int tag=1;
LinkList p=L->Next;
while(p){
if(!tag)
printf(" ");
printf("%d %d", p->Coef, p->Expon);
tag = 0;
p = p->Next;
}
if(tag)
printf("0 0");
}