DropsBrowse Pastes
Login with GitHub

poly

April 15th, 2022Views: 20(0 unique)C++
#include <cmath>
#include <iostream>
#include <list>

class Term {
public:
    int coef;
    int exp;
};

using Polynomial = std::list<Term>;

void getPolynomial(Polynomial &);

int calcPolynomial(const Polynomial &, int);

void combineLikeTerms(Polynomial &);

bool cmp(const Term &, const Term &);

std::ostream &operator<<(std::ostream &, const Polynomial &);

Polynomial operator+(Polynomial, Polynomial);

Polynomial operator-(Polynomial, Polynomial);

int main() {
    Polynomial p, q;

    getPolynomial(p);
    getPolynomial(q);

    p.sort(cmp);
    q.sort(cmp);

    std::cout << "P(x) = " << p << std::endl;
    std::cout << "Q(x) = " << q << std::endl;

    int x;
    std::cout << "x = ";
    std::cin >> x;
    std::cout << "P(" << x << ") = " << calcPolynomial(p, x) << std::endl;
    std::cout << "Q(" << x << ") = " << calcPolynomial(q, x) << std::endl;

    std::cout << "R(x) = " << p + q << std::endl;
    std::cout << "T(x) = " << p - q << std::endl;

    return 0;
}

void getPolynomial(Polynomial &p) {
    int terms;
    std::cin >> terms;
    for (int i = 0; i < terms; i++) {
        Term tmp{};
        std::cin >> tmp.coef >> tmp.exp;
        p.emplace_back(tmp);
    }
}

int calcPolynomial(const Polynomial &p, int x) {
    int r = 0;
    for (const auto it: p) {
        r += it.coef * static_cast<int>(pow(x, it.exp));
    }
    return r;
}

void combineLikeTerms(Polynomial &p) {
    auto it = p.begin();
    while (it != p.end() && std::next(it) != p.end()) {
        if (it->exp == std::next(it)->exp) {
            it->coef += std::next(it)->coef;
            it = p.erase(++it);
        } else {
            it++;
        }
    }
}

bool cmp(const Term &a, const Term &b) {
    return a.exp >= b.exp;
}

std::ostream &operator<<(std::ostream &os, const Polynomial &p) {
    auto it = p.begin();
    os << std::noshowpos << it->coef << "x^" << it->exp;
    while (++it != p.end()) {
        os << std::showpos << it->coef << "x^" << std::noshowpos << it->exp;
    }
    return os;
}

Polynomial operator+(Polynomial p, Polynomial q) {
    auto it = p.end();
    p.splice(it, q);

    p.sort(cmp);
    combineLikeTerms(p);
    return p;
}

Polynomial operator-(Polynomial p, Polynomial q) {
    for (auto &it: q) {
        it.coef *= -1;
    }
    auto it = p.end();
    p.splice(it, q);

    p.sort(cmp);
    combineLikeTerms(p);
    return p;
}