输入样例
2
2 2 1 2 1
2 2 1 2 1
代表
(
2
x
+
2
)
(
2
x
+
2
)
代表(2x+2)(2x+2)
代表(2x+2)(2x+2)
可以输入多个多项式,代码采用数组指针存储多个多项式,每个数组元素各指向一个多项式。
#include<iostream>
using namespace std;
// 多项式类
class Poly {
public:
int coe;
int index;
Poly *next;
Poly(): next(NULL) {}
Poly(int a, int b, Poly* p = NULL): coe(a), index(b), next(p) {}
};
// 多项式列表
class PolyList {
public:
Poly **polyList;
int numList;
// 初始化
PolyList() {
int unitList;
cin >> numList;
// 多项式指针列表
polyList = new Poly*[numList];
for (int i = 0; i < numList; i++) {
polyList[i] = NULL;
}
// 输入多项式,指数从小到大
for (int i = 0; i < numList; i++) {
cin >> unitList;
int coeNum, indexNum;
Poly *temp;
for (int j = 0; j < unitList; j++) {
cin >> coeNum >> indexNum;
temp = new Poly(coeNum, indexNum, polyList[i]);
polyList[i] = temp;
}
}
}
// 二元多项式乘
Poly* doubleMulty(Poly* p, Poly *q) {
Poly *result = NULL;
Poly *head_q = q;
while (p != NULL) {
Poly *temp;
while (q != NULL) {
temp = new Poly(p->coe * q->coe, p->index + q->index, result);
result = temp;
q = q->next;
}
q = head_q;
p = p->next;
}
return result;
}
// 多项式乘法
Poly* Multy() {
Poly *result = polyList[0];
// 将多个计算拆成n-1个二元计算
for (int i = 1; i < numList; i++) {
result = doubleMulty(result, polyList[i]);
}
return merge( result);
}
// 合并同类项
Poly* merge(Poly* pointer) {
Poly *preq, *q, *p, *prep, *head;
p = pointer;
// 合并相同指数
while (p != NULL) {
q = p->next;
preq = p;
while (q != NULL) {
// 如果指数相等
if (q->index == p->index) {
p->coe += q->coe;
preq ->next = q->next;
free(q);
q = preq;
}
preq = q;
q = q->next;
}
p = p->next;
}
// 消除0项,加入头结点方便操作
head = new Poly(0, 0, pointer);
p = pointer;
prep = head;
while (p != NULL) {
if (p->coe == 0) {
prep->next = p->next;
free(p);
p = prep;
}
prep = p;
p = p->next;
}
return Desc(head->next);
}
// 交换指针后的两个节点
void exchange(Poly* p) {
Poly* temp;
temp = p->next->next;
p->next->next = p->next->next->next;
temp->next = p->next;
p->next = temp;
}
//降幂
Poly* Desc(Poly *pointer) {
Poly *head, *p;
int count = 0;
head = new Poly(0, 0, pointer);
p = head->next;
// 统计个数
while (p != NULL) {
count++;
p = p->next;
}
for (int i = count - 1; i > 0; i--) {
p = head;
for (int j = i; j > 0; j--) {
if (p->next->index < p->next->next->index) {
exchange(p);
}
p = p->next;
}
}
return head->next;
}
// 输出
void print(Poly *p) {
Poly *temp = p;
while (temp != NULL) {
cout << temp->coe << ' ' << temp->index << ' ';
temp = temp -> next;
}
cout << '\n';
}
};
int main() {
PolyList a;
a.print(a.Multy());
}