#include <iostream>
#include <stdexcept>
#include <sstream>
struct IComparable {
virtual bool Equal(const IComparable&) const = 0;
};
template <typename T>
T gcd (const T& m, const T& n) {
return n == 0 ? m : gcd (n, m % n);
}
class Frac : public IComparable {
int p, q;
void reduce () {
int d = gcd (p,q);
p /= d;
q /= d;
if (q < 0) {
q = -q;
p = -p;
}
}
public:
Frac (int p=0,int q=1) : p(p), q(q) {
if (q == 0) throw std::invalid_argument("Делитель равен 0");
reduce ();
}
std::string ToString() const {
std::stringstream s;
if (q!=1) s << '(';
if (p>q && p%q)
s << p/q << ' ' << p%q;
else
s << p;
if (q!=1) s << '/' << q << ')';
return s.str();
}
bool operator==(const Frac& other) const {
return p == other.p && q == other.q;
}
bool operator!=(const Frac& other) const {
return !(*this == other);
}
bool Equal(const IComparable& other) const {
const Frac* o = dynamic_cast<const Frac*>(&other);
return o ? *o == *this : false;
}
explicit operator double() const { return double(p)/q; }
Frac operator ~() const { return Frac(q,p); }
Frac operator -() const { return Frac(-p,q); }
Frac& operator +=(const Frac& other) {
p = p*other.q + other.p*q;
q *= other.q;
reduce();
return *this;
}
Frac& operator -=(const Frac& other) {
return *this += -other;
}
Frac& operator *=(const Frac& other) {
p *= other.p;
q *= other.q;
reduce();
return *this;
}
Frac& operator /=(const Frac& other) {
return *this *= ~other;
}
};
Frac operator+(const Frac& lhs, const Frac& rhs) { return Frac (lhs) += rhs; }
Frac operator-(const Frac& lhs, const Frac& rhs) { return Frac (lhs) -= rhs; }
Frac operator*(const Frac& lhs, const Frac& rhs) { return Frac (lhs) *= rhs; }
Frac operator/(const Frac& lhs, const Frac& rhs) { return Frac (lhs) /= rhs; }
Frac polynomial (Frac coef[], size_t n, const Frac& x) {
if (n==0) return 0;
Frac result=coef[n-1];
for (size_t i=n-2; i < n; --i) {
result *= x;
result += coef[i];
}
return result;
}
std::string PolynomialToString (Frac poly[], size_t n) {
std::stringstream s;
for (size_t i=n-1; i < n; --i) {
if (poly[i] != 0) {
if (poly[i] != 1 || i == 0) {
s << poly[i].ToString();
if (i > 0)
s << '*';
}
if (i > 0) {
s << 'x';
if (i > 1)
s << "^" << i;
s << "+";
}
}
}
return s.str();
}
int main () {
Frac poly[] = { Frac(3,2), Frac(1,-3), 0, -Frac (2,7) };
const size_t n = sizeof poly / sizeof poly[0];
Frac x(2,8);
Frac result = polynomial (poly, n, x);
std::cout << PolynomialToString (poly, n) << '=' << result.ToString();
std::cout << '=' << static_cast<double>(result);
std::cout << " при x=" << x.ToString();
std::cout << "\n" << (Frac(2,3)/Frac(2,3)).ToString();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8c3N0cmVhbT4KCnN0cnVjdCBJQ29tcGFyYWJsZSB7Cgl2aXJ0dWFsIGJvb2wgRXF1YWwoY29uc3QgSUNvbXBhcmFibGUmKSBjb25zdCA9IDA7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBnY2QgKGNvbnN0IFQmIG0sIGNvbnN0IFQmIG4pIHsKICAgcmV0dXJuIG4gPT0gMCA/IG0gOiBnY2QgKG4sIG0gJSBuKTsKfQoKY2xhc3MgRnJhYyA6IHB1YmxpYyBJQ29tcGFyYWJsZSB7CiAgaW50IHAsIHE7CiAgCiAgdm9pZCByZWR1Y2UgKCkgewogICAgIGludCBkID0gZ2NkIChwLHEpOwogICAgIHAgLz0gZDsKICAgICBxIC89IGQ7CiAgICAgaWYgKHEgPCAwKSB7CiAgICAgICBxID0gLXE7CiAgICAgICBwID0gLXA7CiAgICAgfQogIH0KICAKcHVibGljOgogIEZyYWMgKGludCBwPTAsaW50IHE9MSkgOiBwKHApLCBxKHEpIHsgCiAgCWlmIChxID09IDApIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgi0JTQtdC70LjRgtC10LvRjCDRgNCw0LLQtdC9IDAiKTsKICAJcmVkdWNlICgpOwogIH0KICAKICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsgCiAgCXN0ZDo6c3RyaW5nc3RyZWFtIHM7CiAgCWlmIChxIT0xKSBzIDw8ICcoJzsKICAJaWYgKHA+cSAmJiBwJXEpCiAgCSAgcyA8PCBwL3EgPDwgJyAnIDw8IHAlcTsKICAJZWxzZQogIAkgIHMgPDwgcDsKICAJaWYgKHEhPTEpIHMgPDwgJy8nIDw8IHEgPDwgJyknOwogIAlyZXR1cm4gcy5zdHIoKTsKICB9CiAgCiAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZyYWMmIG90aGVyKSBjb25zdCB7CiAgCXJldHVybiBwID09IG90aGVyLnAgJiYgcSA9PSBvdGhlci5xOwogIH0KCiAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZyYWMmIG90aGVyKSBjb25zdCB7CiAgCXJldHVybiAhKCp0aGlzID09IG90aGVyKTsKICB9CiAgCiAgYm9vbCBFcXVhbChjb25zdCBJQ29tcGFyYWJsZSYgb3RoZXIpIGNvbnN0IHsKICAJY29uc3QgRnJhYyogbyA9IGR5bmFtaWNfY2FzdDxjb25zdCBGcmFjKj4oJm90aGVyKTsKICAJcmV0dXJuIG8gPyAqbyA9PSAqdGhpcyA6IGZhbHNlOwogIH0KICAKICBleHBsaWNpdCBvcGVyYXRvciBkb3VibGUoKSBjb25zdCB7IHJldHVybiBkb3VibGUocCkvcTsgfQogIAogIEZyYWMgb3BlcmF0b3IgfigpIGNvbnN0IHsgcmV0dXJuIEZyYWMocSxwKTsgfQogIEZyYWMgb3BlcmF0b3IgLSgpIGNvbnN0IHsgcmV0dXJuIEZyYWMoLXAscSk7IH0KICAKICBGcmFjJiBvcGVyYXRvciArPShjb25zdCBGcmFjJiBvdGhlcikgeyAKICAJcCA9IHAqb3RoZXIucSArIG90aGVyLnAqcTsKICAJcSAqPSBvdGhlci5xOwogIAlyZWR1Y2UoKTsKICAJcmV0dXJuICp0aGlzOwogIH0KICBGcmFjJiBvcGVyYXRvciAtPShjb25zdCBGcmFjJiBvdGhlcikgeyAKICAJcmV0dXJuICp0aGlzICs9IC1vdGhlcjsKICB9CiAgRnJhYyYgb3BlcmF0b3IgKj0oY29uc3QgRnJhYyYgb3RoZXIpIHsgCiAgCXAgKj0gb3RoZXIucDsKICAJcSAqPSBvdGhlci5xOwogIAlyZWR1Y2UoKTsKICAJcmV0dXJuICp0aGlzOwogIH0KICBGcmFjJiBvcGVyYXRvciAvPShjb25zdCBGcmFjJiBvdGhlcikgeyAKICAJcmV0dXJuICp0aGlzICo9IH5vdGhlcjsKICB9Cn07CgpGcmFjIG9wZXJhdG9yKyhjb25zdCBGcmFjJiBsaHMsIGNvbnN0IEZyYWMmIHJocykgeyByZXR1cm4gRnJhYyAobGhzKSArPSByaHM7IH0KRnJhYyBvcGVyYXRvci0oY29uc3QgRnJhYyYgbGhzLCBjb25zdCBGcmFjJiByaHMpIHsgcmV0dXJuIEZyYWMgKGxocykgLT0gcmhzOyB9CkZyYWMgb3BlcmF0b3IqKGNvbnN0IEZyYWMmIGxocywgY29uc3QgRnJhYyYgcmhzKSB7IHJldHVybiBGcmFjIChsaHMpICo9IHJoczsgfQpGcmFjIG9wZXJhdG9yLyhjb25zdCBGcmFjJiBsaHMsIGNvbnN0IEZyYWMmIHJocykgeyByZXR1cm4gRnJhYyAobGhzKSAvPSByaHM7IH0KCkZyYWMgcG9seW5vbWlhbCAoRnJhYyBjb2VmW10sIHNpemVfdCBuLCBjb25zdCBGcmFjJiB4KSB7CiAgaWYgKG49PTApIHJldHVybiAwOwogIEZyYWMgcmVzdWx0PWNvZWZbbi0xXTsKICBmb3IgKHNpemVfdCBpPW4tMjsgaSA8IG47IC0taSkgewogIAlyZXN1bHQgKj0geDsKICAJcmVzdWx0ICs9IGNvZWZbaV07CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCnN0ZDo6c3RyaW5nIFBvbHlub21pYWxUb1N0cmluZyAoRnJhYyBwb2x5W10sIHNpemVfdCBuKSB7CiAgc3RkOjpzdHJpbmdzdHJlYW0gczsKICBmb3IgKHNpemVfdCBpPW4tMTsgaSA8IG47IC0taSkgewogIAlpZiAocG9seVtpXSAhPSAwKSB7CiAgCSAgaWYgKHBvbHlbaV0gIT0gMSB8fCBpID09IDApIHsKICAJICAJcyA8PCBwb2x5W2ldLlRvU3RyaW5nKCk7CiAgCSAgCWlmIChpID4gMCkKICAJICAJICBzIDw8ICcqJzsKICAJICB9CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIHMgPDwgJ3gnOwogICAgICAgIGlmIChpID4gMSkKICAgICAgICAgIHMgPDwgIl4iIDw8IGk7CiAgICAgICAgcyA8PCAiKyI7CiAgICAgIH0KICAJfQogIH0KICByZXR1cm4gcy5zdHIoKTsKfQoKaW50IG1haW4gKCkgewogIAogIEZyYWMgcG9seVtdID0geyBGcmFjKDMsMiksIEZyYWMoMSwtMyksIDAsIC1GcmFjICgyLDcpIH07CiAgY29uc3Qgc2l6ZV90IG4gPSBzaXplb2YgcG9seSAvIHNpemVvZiBwb2x5WzBdOwoKICBGcmFjIHgoMiw4KTsgCgogIEZyYWMgcmVzdWx0ID0gcG9seW5vbWlhbCAocG9seSwgbiwgeCk7CgogIHN0ZDo6Y291dCA8PCBQb2x5bm9taWFsVG9TdHJpbmcgKHBvbHksIG4pIDw8ICc9JyA8PCByZXN1bHQuVG9TdHJpbmcoKTsKICBzdGQ6OmNvdXQgPDwgJz0nIDw8IHN0YXRpY19jYXN0PGRvdWJsZT4ocmVzdWx0KTsKICBzdGQ6OmNvdXQgPDwgIiDQv9GA0LggeD0iIDw8IHguVG9TdHJpbmcoKTsKICAKICBzdGQ6OmNvdXQgPDwgIlxuIiA8PCAoRnJhYygyLDMpL0ZyYWMoMiwzKSkuVG9TdHJpbmcoKTsKfQ==