设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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 <stdio.h>
#include <stdlib.h>
#include <iostream>
typedef struct {//数据元素
int coef;
int expn;
}ElemType;
typedef struct LNode {//结点
ElemType data;
struct LNode *next;
}*Position;
typedef struct{
Position head, rear;
}Polynomial;//一元多项式
void InitPolyn(Polynomial *p){//初始化一元多项式
(*p).head = (Position)malloc(sizeof(LNode));
(*p).head->data.coef = 0;
(*p).head->data.expn = 0;
(*p).head->next = NULL;
(*p).rear = (*p).head;
}
//在链表的尾端插入结点
void Attach(int c, int e, Position *pRear) {
Position p = (Position)malloc(sizeof(struct LNode));
p->data.coef = c;
p->data.expn = e;
p->next = NULL;
(*pRear)->next = p;
*pRear = (*pRear)->next;
}
//读入一个一元多项式
void ReadPolyn(Polynomial p,int n) {
for (int i = 0; i < n; i++) {
int c, e;
std::cin >> c >> e;
Attach(c,e,&p.rear);
}
}
//输出一个一元多项式
void PrintPolyn(Polynomial p) {
Position q = p.head->next;
if (!p.head->next) {
printf("%d %d\n", 0, 0);
return;
}
if (!q->data.coef)
printf("%d %d",0 ,0);
while (q->next != NULL) {
if (!q->data.coef)break;
else printf("%d %d ", q->data.coef, q->data.expn);
q = q->next;
}
if(q->data.coef)
printf("%d %d",q->data.coef,q->data.expn);
printf("\n");
}
//比较数据元素的大小
int cmp(ElemType a, ElemType b) {
if (a.expn > b.expn)return 1;
else if (a.expn == b.expn)return 0;
else return -1;
}
//获取一元多项式其中一项的数据元素
ElemType GetCurElem(Position p) {
return p->data;
}
//两个一元多项式相加
Polynomial AddPolyn(Polynomial p1,Polynomial p2) {
Polynomial p;//新建一个链表用来存储相加的和
InitPolyn(&p);
int sum;
Position qa = p1.head->next, qb = p2.head->next;//qa和qb分别指向pa和pb的当前结点
while (qa && qb) {
ElemType a = GetCurElem(qa), b = GetCurElem(qb);
switch (cmp(a,b)) {
case 1:
Attach(a.coef,a.expn,&p.rear);
qa = qa->next;
break;
case -1:
Attach(b.coef, b.expn, &p.rear);
qb = qb->next;
break;
case 0:
sum = a.coef + b.coef;
if (sum)Attach(sum, a.expn, &p.rear);
qa = qa->next;
qb = qb->next;
break;
}
}
for (; qa; qa = qa->next)
Attach(qa->data.coef, qa->data.expn, &p.rear);
for (; qb; qb = qb->next)
Attach(qb->data.coef, qb->data.expn, &p.rear);
p.rear->next = NULL;
return p;
}
Polynomial MultPolyn(Polynomial p1,Polynomial p2) {
Polynomial p;
InitPolyn(&p);
Position t1 = p1.head->next, t2 = p2.head->next;
if (!t1 || !t2) return p;//判断p1和p2是否为空;
while (t2) {
Attach(t1->data.coef*t2->data.coef,t1->data.expn+t2->data.expn,&p.rear);
t2 = t2->next;
}
t1 = t1->next;
while (t1) {
t2 = p2.head->next;
p.rear = p.head;
while (t2) {
int c, e;
c = t1->data.coef*t2->data.coef;
e = t1->data.expn+t2->data.expn;
while (p.rear->next&&p.rear->next->data.expn > e)
p.rear = p.rear->next;
if (p.rear->next&&p.rear->next->data.expn == e) {
if (p.rear->next->data.coef + c)
p.rear->next->data.coef += c;
else {
Position temp;
temp = p.rear->next;
p.rear->next = temp->next;
free(temp);
}
}
else {
Position t;
t = p.rear->next;
Attach(c, e, &p.rear);
p.rear->next = t;
}
t2 = t2->next;
}
t1 = t1->next;
}
p.rear->next = NULL;
return p;
}
//主函数
int main() {
Polynomial p1, p2;
InitPolyn(&p1);
InitPolyn(&p2);
int n1, n2;
std::cin >> n1;
ReadPolyn(p1, n1);
std::cin >> n2;
ReadPolyn(p2, n2);
PrintPolyn(MultPolyn(p1,p2));//输出p1和p2的积
PrintPolyn(AddPolyn(p1,p2));//输出p1和p2的和
return 0;
}
注意:块错误
ps:测试数据中可能出现非零项的个数为零的情况