设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
C语言实现代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct PolyNode *Polynomial;
struct PolyNode {
int coef;
int expon;
Polynomial next;
};
// 连接多项式
void Attach(Polynomial *pRear, int coef, int expon) {
Polynomial point = (Polynomial)malloc(sizeof(struct PolyNode)); // 创建新节点
point->coef = coef;
point->expon = expon;
point->next = NULL;
(*pRear)->next = point;
*pRear = point;
}
// 读入多项式
Polynomial ReadPoly() {
int count, coef, expon;
scanf("%d", &count);
Polynomial Head = (Polynomial)malloc(sizeof(struct PolyNode)); // 链表头空节点
Head->next = NULL;
Polynomial Rear = Head;
while (count--) {
scanf("%d %d", &coef, &expon);
Attach(&Rear, coef, expon);
}
Polynomial temp = Head; // 删除链表头空节点
Head = Head->next;
free(temp);
return Head;
}
// 打印多项式
void PrintPoly(Polynomial Poly) {
int flag = 0;
if (!Poly) {
printf("0 0\n");
return;
}
while (Poly) {
if (!flag)
flag = 1;
else
printf(" ");
printf("%d %d", Poly->coef, Poly->expon);
Poly = Poly->next;
}
printf("\n");
}
// 多项式求和
Polynomial AddPloys(Polynomial P1, Polynomial P2) {
int sum;
Polynomial front, rear, temp;
front = (Polynomial)malloc(sizeof(struct PolyNode));
front->next = NULL;
rear = front;
while (P1 && P2) {
if (P1->expon == P2->expon) {
sum = P1->coef + P2->coef;
if (sum) {
Attach(&rear, sum, P1->expon);
P1 = P1->next;
P2 = P2->next;
}
}
else if (P1->expon > P2->expon) {
Attach(&rear, P1->coef, P1->expon);
P1 = P1->next;
}
else {
Attach(&rear, P2->coef, P2->expon);
P2 = P2->next;
}
}
for (; P1; P1 = P1->next) Attach(&rear, P1->coef, P1->expon);
for (; P2; P2 = P2->next) Attach(&rear, P2->coef, P2->expon);
rear->next = NULL;
temp = front;
front = front->next;
free(temp);
return front;
}
// 多项式求积
Polynomial MultPloys(Polynomial P1, Polynomial P2) {
int coef, expon;
Polynomial front, rear, temp;
Polynomial t1 = P1, t2 = P2;
if (!t1 || !t2) return NULL;
front = (Polynomial)malloc(sizeof(struct PolyNode));
front->next = NULL;
rear = front;
while (t2) { // 先用P1的第一项乘以P2,得到front
Attach(&rear, t1->coef * t2->coef, t1->expon + t2->expon);
t2 = t2->next;
}
t1 = t1->next;
while (t1) {
t2 = P2;
rear = front;
while (t2) {
coef = t1->coef * t2->coef;
expon = t1->expon + t2->expon;
while (rear->next && rear->next->expon > expon) {
rear = rear->next;
}
if (rear->next && rear->next->expon == expon) {
if (rear->next->coef + coef) {
rear->next->coef += coef;
}
else {
temp = rear->next;
rear->next = temp->next;
free(temp);
}
}
else {
temp = (Polynomial)malloc(sizeof(struct PolyNode));
temp->coef = coef;
temp->expon = expon;
temp->next = rear->next;
rear->next = temp;
rear = rear->next;
}
t2 = t2->next;
}
t1 = t1->next;
}
temp = front;
front = front->next;
free(temp);
return front;
}
int main() {
Polynomial p1, p2, pa, pm;
p1 = ReadPoly();
p2 = ReadPoly();
pm = MultPloys(p1, p2);
PrintPoly(pm);
pa = AddPloys(p1, p2);
PrintPoly(pa);
return 0;
}