Ok。あなたの助けのおかげで、これまでのところ私がうまくコーディングした操作は次のとおりです。
追記:
polinom operator+(const polinom& P) const
{
polinom Result;
constIter i = poly.begin(), j = P.poly.begin();
while (i != poly.end() && j != P.poly.end()) { //logic while both iterators are valid
if (i->pow > j->pow) { //if the current term's degree of the first polynomial is bigger
Result.insert(i->coef, i->pow);
i++;
}
else if (j->pow > i->pow) { // if the other polynomial's term degree is bigger
Result.insert(j->coef, j->pow);
j++;
}
else { // if both are equal
Result.insert(i->coef + j->coef, i->pow);
i++;
j++;
}
}
//handle the remaining items in each list
//note: at least one will be equal to end(), but that loop will simply be skipped
while (i != poly.end()) {
Result.insert(i->coef, i->pow);
++i;
}
while (j != P.poly.end()) {
Result.insert(j->coef, j->pow);
++j;
}
return Result;
}
減算:
polinom operator-(const polinom& P) const //fixed prototype re. const-correctness
{
polinom Result;
constIter i = poly.begin(), j = P.poly.begin();
while (i != poly.end() && j != P.poly.end()) { //logic while both iterators are valid
if (i->pow > j->pow) { //if the current term's degree of the first polynomial is bigger
Result.insert(-(i->coef), i->pow);
i++;
}
else if (j->pow > i->pow) { // if the other polynomial's term degree is bigger
Result.insert(-(j->coef), j->pow);
j++;
}
else { // if both are equal
Result.insert(i->coef - j->coef, i->pow);
i++;
j++;
}
}
//handle the remaining items in each list
//note: at least one will be equal to end(), but that loop will simply be skipped
while (i != poly.end()) {
Result.insert(i->coef, i->pow);
++i;
}
while (j != P.poly.end()) {
Result.insert(j->coef, j->pow);
++j;
}
return Result;
}
乗算:
polinom operator*(const polinom& P) const
{
polinom Result;
constIter i, j, lastItem = Result.poly.end();
Iter it1, it2, first, last;
int nr_matches;
for (i = poly.begin() ; i != poly.end(); i++) {
for (j = P.poly.begin(); j != P.poly.end(); j++)
Result.insert(i->coef * j->coef, i->pow + j->pow);
}
Result.poly.sort(SortDescending());
lastItem--;
while (true) {
nr_matches = 0;
for (it1 = Result.poly.begin(); it1 != lastItem; it1++) {
first = it1;
last = it1;
first++;
for (it2 = first; it2 != Result.poly.end(); it2++) {
if (it2->pow == it1->pow) {
it1->coef += it2->coef;
nr_matches++;
}
}
nr_matches++;
do {
last++;
nr_matches--;
} while (nr_matches != 0);
Result.poly.erase(first, last);
}
if (nr_matches == 0)
break;
}
return Result;
}
部門(編集済み):
polinom operator/(const polinom& P) const
{
polinom Result, temp2;
polinom temp = *this;
Iter i = temp.poly.begin();
constIter j = P.poly.begin();
int resultSize = 0;
if (temp.poly.size() < 2) {
if (i->pow >= j->pow) {
Result.insert(i->coef / j->coef, i->pow - j->pow);
temp = temp - Result * P;
}
else {
Result.insert(0, 0);
}
}
else {
while (true) {
if (i->pow >= j->pow) {
Result.insert(i->coef / j->coef, i->pow - j->pow);
if (Result.poly.size() < 2)
temp2 = Result;
else {
temp2 = Result;
resultSize = Result.poly.size();
for (int k = 1 ; k != resultSize; k++)
temp2.poly.pop_front();
}
temp = temp - temp2 * P;
}
else
break;
}
}
return Result;
}
};
最初の 3 つは正しく機能していますが、プログラムが無限ループに陥っているように見えるため、除算は機能しません。
最終更新 Dave の話を聞いた後、/ と & の両方をオーバーロードして、商と剰余を返すようにしました。皆さんの助け、特に素晴らしいアイデアをくれた Dave に感謝します!
PS誰かが私にこれらの2つのオーバーロードされたオペレーターを投稿したい場合は、私の投稿にコメントして質問してください(関係者全員に投票してください)。