设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
#include<cstdio>
#include<cstdlib>
typedef struct Node *Polynomial;
struct Node{
int coef;
int exp;
Polynomial link;
};
void attach(int coef, int exp, Polynomial *pRear){
Polynomial p;
p = (Polynomial)malloc(sizeof(struct Node));
p->coef = coef;
p->exp = exp;
(*pRear)->link = p;
*pRear = p;
}
Polynomial read(){
int n, a, b;
Polynomial Rear, p, t;
p = (Polynomial)malloc(sizeof(struct Node));
p->link = NULL;
Rear = p;
scanf("%d", &n);
while(n--){
scanf("%d%d", &a, &b);
attach(a, b, &Rear);
}
Rear->link = NULL;
t = p; p = p->link; free(t);
return p;
}
Polynomial add(Polynomial p1, Polynomial p2){
Polynomial p, t1, t2, Rear, t;
t1 = p1; t2 = p2;
p = (Polynomial)malloc(sizeof(struct Node));
Rear = p;
p->link = NULL;
while(t1 && t2){
if(t1->exp == t2->exp){
int c = t1->coef + t2->coef;
if(c)attach(c, t1->exp, &Rear);
t1 = t1->link;
t2 = t2->link;
}else if(t1->exp < t2->exp){
Rear->link = t2;
Rear = t2;
t2 = t2->link;
}else{
Rear->link = t1;
Rear = t1;
t1 = t1->link;
}
}
Rear->link = t1 ? t1 : t2;
t = p; p = p->link; free(t);
return p;
}
Polynomial multi(Polynomial p1, Polynomial p2){
Polynomial p, t1, t2, Rear, temp;
int e, c;
if(!p1 || !p2)return NULL;
p = (Polynomial)malloc(sizeof(struct Node));
p->link = NULL;
Rear = p;
t1 = p1; t2 = p2;
while(t2){
e = t1->exp + t2->exp;
c = t1->coef * t2->coef;
attach(c, e, &Rear);
t2 = t2->link;
}
t1 = t1->link;
while(t1){
t2 = p2; Rear = p;
while(t2){
e = t1->exp + t2->exp;
c = t1->coef * t2->coef;
while(Rear->link && Rear->link->exp > e)Rear = Rear->link; //注意要判断Rear->next是否存在
if(Rear->link && Rear->link->exp == e){
if(Rear->link->coef + c){
Rear->link->coef += c;
}else{
temp = Rear->link;
Rear->link = temp->link;
free(temp);
}
}else{
temp = (Polynomial)malloc(sizeof(struct Node));
temp->exp = e;
temp->coef = c;
temp->link = Rear->link;
Rear->link = temp;
}
t2 = t2->link;
}
t1 = t1->link;
}
Rear->link->link = NULL; //注意点
temp = p; p = p->link; free(temp);
return p;
}
void print(Polynomial p){
Polynomial t = p;
if(t == NULL){
printf("0 0\n");
return;
}
else{
while(t){
if(t->link != NULL)printf("%d %d ", t->coef, t->exp);
else printf("%d %d\n", t->coef, t->exp);
t = t->link;
}
}
}
int main(){
Polynomial p1, p2, p3, p4;
p1 = read();
p2 = read();
p3 = multi(p1, p2);
print(p3);
p4 = add(p1, p2);
print(p4);
return 0;
}