设计一个函数,分别求出两个一元多项式的和与乘积
##输入样例
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
#输出结果
5 20 -4 4 -5 2 9 1 -2 0
##输入样例
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
#输出结果
5 20 -4 4 -5 2 9 1 -2 0
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
#include <iostream>
using namespace std;
typedef struct PolyNode *Polynomial;
struct PolyNode
{
int coef; //系数
int expon; //指数
Polynomial next;
};
int compare(int c1, int c2)
{
if (c1 > c2) return 1;
else if (c1 < c2) return -1;
else return 0;
}
void Attach(int c, int e, Polynomial &pRear)
{
Polynomial Tmp = new struct PolyNode;
Tmp->coef = c;
Tmp->expon = e;
Tmp->next = NULL;
pRear->next = Tmp;
pRear = Tmp;
}
Polynomial ReadPoly()
{
int N; //读入项数
cin >> N;
Polynomial L = new struct PolyNode; //生成头结点
L->next = NULL;
Polynomial rear = L;
while (N--)
{
int c, e;
cin >> c >> e;
Attach(c, e, rear);
}
Polynomial head = L->next;
delete L;
return head;
}
Polynomial ReadPoly_Decrease() //如果输入的不是按照递减的顺序,通过这个函数可以实现构造多项式是按照系数递减的顺序构造的
{
int N; //读入项数
cin >> N;
Polynomial L = new struct PolyNode; //生成头结点
L->next = NULL;
while (N--)
{
int c, e;
cin >> c >> e;
Polynomial p = L;
Polynomial Tmp = new struct PolyNode;
Tmp->coef = c;
Tmp->expon = e;
Tmp->next = NULL;
while (p->next && p->next->expon > e) //按照指数递减的顺序寻找读入的元素应该插入的位置
p = p->next;
Tmp->next = p->next;
p->next = Tmp;
}
Polynomial head = L->next;
delete L;
return head;
}
Polynomial Add(Polynomial P1, Polynomial P2)
{
Polynomial P3 = new struct PolyNode;
P3->next = NULL;
Polynomial rear = P3;
while (P1 && P2)
{
switch (compare(P1->expon,P2->expon))
{
case -1: //P2的指数较大
Attach(P2->coef, P2->expon, rear);
P2 = P2->next;
break;
case 1: //P1的指数较大
Attach(P1->coef, P1->expon, rear);
P1 = P1->next;
break;
case 0:
if (P1->coef + P2->coef != 0)
Attach(P1->coef + P2->coef, P1->expon, rear);
P1 = P1->next;
P2 = P2->next;
break;
default:
break;
}
}
rear->next = P1 ? P1 : P2;
Polynomial head = P3->next;
delete P3;
return head;
}
Polynomial Mult(Polynomial P1, Polynomial P2)
{
Polynomial P3 = new struct PolyNode;
P3->next = NULL;
Polynomial rear = P3;
Polynomial t1 = P1;
Polynomial t2 = P2;
while (t2)
{
Attach(t1->coef*t2->coef, t1->expon + t2->expon, rear);
t2 = t2->next;
}
t1 = t1->next;
while (t1)
{
t2 = P2;
while (t2)
{
int c = t1->coef * t2->coef;
int e = t1->expon + t2->expon;
//找到正确的插入位置
Polynomial p = P3;
while (p->next && p->next->expon > e) //按照指数递减的顺序寻找读入的元素应该插入的位置
p = p->next;
Polynomial q = p->next;
if(q && q->expon == e) //指数相等的情况
{
if (q->coef + e != 0) //系数相加不为0
{
q->coef += c;
}
else //系数的结果相加为0
{
p->next = q->next;
delete q;
}
}
else
{
Polynomial Tmp = new struct PolyNode; //构造新的结点
Tmp->coef = c;
Tmp->expon = e;
Tmp->next = q;
p->next = Tmp;
}
t2 = t2->next;
}
t1 = t1->next;
}
Polynomial head = P3->next;
delete P3;
return head;
}
void PrintPoly(Polynomial P)
{
int flag = 0; //标记是否为第一项
while (P)
{
if (!P) cout << "0 0" << endl;
if (flag == 0) flag = 1;
else cout << " ";
cout << P->coef << " " << P->expon;
P = P->next;
}
cout << endl;
}
int main()
{
Polynomial P1 = ReadPoly();
Polynomial P2 = ReadPoly();
PrintPoly(P1);
PrintPoly(P2);
Polynomial add_p1_p2 = Add(P1, P2);
PrintPoly(add_p1_p2);
Polynomial mult_p1_p2 = Mult(P1, P2);
PrintPoly(mult_p1_p2);
}