多項式加法與乘法
===
```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Term {
int coef;
int exp;
};
bool compareTerms(const Term& a, const Term& b) {
return a.exp > b.exp;
}
int main(void) {
vector<Term> poly1, poly2, polyAdd, polyMult;
int coef, exp;
// Input for the first polynomial
cin >> coef;
while (coef != -1) {
cin >> exp;
poly1.push_back({ coef, exp });
cin >> coef;
}
sort(poly1.begin(), poly1.end(), compareTerms);
// Input for the second polynomial
cin >> coef;
while (coef != -1) {
cin >> exp;
poly2.push_back({ coef, exp });
cin >> coef;
}
sort(poly2.begin(), poly2.end(), compareTerms);
// Add
auto it1 = poly1.begin(), it2 = poly2.begin();
while (it1 != poly1.end() && it2 != poly2.end()) {
if (it1->exp == it2->exp) {
polyAdd.push_back({ it1->coef + it2->coef, it1->exp });
++it1;
++it2;
}
else if (it1->exp > it2->exp) {
polyAdd.push_back(*it1);
++it1;
}
else {
polyAdd.push_back(*it2);
++it2;
}
}
while (it1 != poly1.end()) {
polyAdd.push_back(*it1);
++it1;
}
while (it2 != poly2.end()) {
polyAdd.push_back(*it2);
++it2;
}
sort(polyAdd.begin(), polyAdd.end(), compareTerms);
// Multiply
for (const auto& term1 : poly1) {
for (const auto& term2 : poly2) {
int resultCoef = term1.coef * term2.coef;
int resultExp = term1.exp + term2.exp;
bool found = false;
for (auto& term : polyMult) {
if (term.exp == resultExp) {
term.coef += resultCoef;
found = true;
break;
}
}
if (!found) {
polyMult.push_back({ resultCoef, resultExp });
}
}
}
sort(polyMult.begin(), polyMult.end(), compareTerms);
// Output
cout << "add = ";
for (const auto& term : polyAdd) {
cout << term.coef;
if (term.exp > 0) {
cout << "x";
if (term.exp > 1)
cout << "^" << term.exp;
}
if (&term != &polyAdd.back()) {
cout << " + ";
}
}
cout << endl;
cout << "mult = ";
for (const auto& term : polyMult) {
cout << term.coef;
if (term.exp > 0) {
cout << "x";
if (term.exp > 1)
cout << "^" << term.exp;
}
if (&term != &polyMult.back()) {
cout << " + ";
}
}
cout << endl;
return 0;
}
```
```
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
struct Link_list {
int coef;
int exp;
Link_list* nex;
};
int main(void) {
Link_list* head1=new(Link_list), * head2 = new(Link_list), * heada = new(Link_list), * headm = new(Link_list);
head1->nex = NULL;
head2->nex = NULL; heada->nex = NULL; headm->nex = NULL;
Link_list * pos1 = head1, * pos2 = head2 ,* posa = heada;
int coef, exp;
int max = 0;
cin >> coef;
while (coef != -1) {
cin >> exp;
Link_list* p = new(Link_list);
p->coef = coef;
p->exp = exp;
bool done = false;
for (pos1 = head1; pos1->nex != NULL; pos1 = pos1->nex) {
if (p->exp > pos1->nex->exp) {
p->nex = pos1->nex;
pos1->nex = p;
done = true;
break;
}
}
if (!done) {
p->nex = pos1->nex;
pos1->nex = p;
}
cin >> coef;
}
cin >> coef;
while (coef != -1) {
cin >> exp;
Link_list* p = new(Link_list);
p->coef = coef;
p->exp = exp;
bool done = false;
for (pos2 = head2; pos2->nex != NULL; pos2 = pos2->nex) {
if (p->exp > pos2->nex->exp) {
p->nex = pos2->nex;
pos2->nex = p;
done = true;
break;
}
}
if (!done) {
p->nex = pos2->nex;
pos2->nex = p;
}
cin >> coef;
}
//add
pos1 = head1->nex; pos2 = head2->nex;
while (pos1 != NULL && pos2 != NULL) {
if (pos1->exp == pos2->exp) {
Link_list* p = new(Link_list);
p->coef = pos1->coef + pos2->coef;
p->exp = pos1->exp;
p->nex = posa->nex;
posa->nex = p;
posa = p;
pos1 = pos1->nex;
pos2 = pos2->nex;
}
else if (pos1->exp > pos2->exp ) {
Link_list* p = new(Link_list);
p->coef = pos1->coef ;
p->exp = pos1->exp;
p->nex = posa->nex;
posa->nex = p;
posa = p;
pos1 = pos1->nex;
}
else if (pos1->exp < pos2->exp) {
Link_list* p = new(Link_list);
p->coef = pos2->coef;
p->exp = pos2->exp;
p->nex = posa->nex;
posa->nex = p;
posa = p;
pos2 = pos2->nex;
}
}
while (pos1 != NULL) {
Link_list* p = new(Link_list);
p->coef = pos1->coef;
p->exp = pos1->exp;
p->nex = posa->nex;
posa->nex = p;
posa = p;
pos1 = pos1->nex;
}
while (pos2 != NULL) {
Link_list* p = new(Link_list);
p->coef = pos2->coef;
p->exp = pos2->exp;
p->nex = posa->nex;
posa->nex = p;
posa = p;
pos2 = pos2->nex;
}
//mult
Link_list* pos = headm->nex;
for (pos1 = head1->nex; pos1 != NULL; pos1 = pos1->nex) {
for (pos2 = head2->nex; pos2 != NULL; pos2 = pos2->nex) {
exp = pos1->exp + pos2->exp;
bool done = false;
for (pos = headm; pos->nex != NULL; pos = pos->nex) {
if (pos->nex->exp == exp) {
pos->nex->coef += pos1->coef * pos2->coef;
done = true;
break;
}
else if (exp > pos->nex->exp) {
Link_list* p = new(Link_list);
p->coef = pos1->coef * pos2->coef;
p->exp = exp;
p->nex = pos->nex;
pos->nex = p;
done = true;
break;
}
}
if (!done) {
Link_list* p = new(Link_list);
p->coef = pos1->coef * pos2->coef;
p->exp = exp;
p->nex = pos->nex;
pos->nex = p;
}
}
}
//output
cout << "add = ";
for (Link_list* p = heada->nex; p != NULL; p = p->nex) {
cout << p->coef;
if (p->exp > 0) {
cout << "x";
if (p->exp > 1) cout << "^" << p->exp;
}
if (p->nex != NULL) {
cout << " + ";
}
}
cout << endl;
cout << "mult = ";
for (Link_list* p = headm->nex; p != NULL; p = p->nex) {
cout << p->coef;
if (p->exp > 0) {
cout << "x";
if (p->exp > 1) cout << "^" << p->exp;
}
if (p->nex != NULL) {
cout << " + ";
}
}
cout << endl;
return 0;
}
```