#include <iostream>
using namespace std;
class Fraction {
protected:
int n, d;
int gcd(int N, int D) { return (N == 0? D: gcd(D%N, N)); }
void restrict() {int t = gcd(this->n, this->d); this->n =this->n / t; this->d /= t;}
public:
// Fraction(int N = 1, int D = 1) {int t = gcd(N,D); n = N/t; d = D/t;}
Fraction(int n=1, int d=1 ): n(n), d(d) {restrict();}
int getD() {return d;}
int getN() {return n;}
// x * 2 - працює
// 2 * x - не працює,якщо операцыя оголошена як метод класу, а не friend функція
// const Fraction operator*(const Fraction & y) { return Fraction(n * y.n, d * y.d); }
friend Fraction operator*(const Fraction &, const Fraction &);
const Fraction operator/(const Fraction & y) { return Fraction(n * y.d, d * y.n); }
// const Fraction operator+(const Fraction & rhs) {
//return Fraction(this->n * rhs.d + this->d * rhs.n, this->d * rhs.d); }
const Fraction operator-(const Fraction & y) { return Fraction(n * y.d - d * y.n, d * y.d); }
const Fraction operator+(const Fraction & y) { return Fraction(n * y.d + d * y.n, d * y.d); }
const Fraction operator*(const Fraction & y) { return Fraction(n * y.n, d * y.d); }
const Fraction operator-() { return Fraction(-n, d); }
Fraction operator*=(const Fraction & y) { n *= y.n; d *= y.d; restrict(); return *this;}
Fraction operator++() { n += d; return *this;}
const Fraction operator++(int) {n += d; return Fraction(n-d, d); }
friend std::ostream & operator<<(std::ostream &, const Fraction);
friend std::istream & operator>> (std::istream &, Fraction &);
int sum(int b){
return this->n+b;
}
};
class T:public Fraction{
private:
int w;
public:
T(int c,int n,int d):Fraction(c*d+n,d){
}
};
Fraction operator*(const Fraction & x, const Fraction & y) { return Fraction(x.n * y.n, x.d * y.d); }
std::ostream & operator<< (std::ostream & out, const Fraction x) {
out << x.n << "/" << x.d;
//out<<"Hello";
return out;
}
std::istream & operator>> (std::istream & in, Fraction & x) {
int N, D;
in >> N >> D;
x = Fraction(N, D);
return in;
}
int main() {
Fraction x(1,3),y(1,2);
cout<<y+x<<endl;
cout<<-x<<endl;
cout<<y;
// cout<<x+y<<"123";
// cout<<y<<endl;
//cout<<endl;
//cout<<x.sum(5);
// cout << 2 * y << '\n'; //чому тут немає помилки, як працює?
// cin >> z;
// cout<<z<<endl;
// std::cout << x + y << '\n';
// z *= 2;
// std::cout << z << '\n';
// std::cout << ++z << '\n';
// std::cout << z++ << '\n';
// std::cout << z << '\n';
// T t(1,2,3);
// std::cout<<t;
}
/*
План:
+.-,*./, %. +
1. мінус
2. Унарнний мінус
3. x *= 2
4. ++x, x++
5. 2 + x
*/
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBGcmFjdGlvbiB7CnByb3RlY3RlZDoKCWludCBuLCBkOwoJaW50IGdjZChpbnQgTiwgaW50IEQpIHsJcmV0dXJuIChOID09IDA/IEQ6IGdjZChEJU4sIE4pKTsgfQoJdm9pZCByZXN0cmljdCgpIHtpbnQgdCA9IGdjZCh0aGlzLT5uLCB0aGlzLT5kKTsgdGhpcy0+biA9dGhpcy0+biAvIHQ7IHRoaXMtPmQgLz0gdDt9CnB1YmxpYzoKCi8vCUZyYWN0aW9uKGludCBOID0gMSwgaW50IEQgPSAxKSB7aW50IHQgPSBnY2QoTixEKTsgbiA9IE4vdDsgZCA9IEQvdDt9CglGcmFjdGlvbihpbnQgbj0xLCBpbnQgZD0xICk6IG4obiksIGQoZCkge3Jlc3RyaWN0KCk7fQoJaW50IGdldEQoKSB7cmV0dXJuIGQ7fQoJaW50IGdldE4oKSB7cmV0dXJuIG47fQoKLy8gICB4ICogMiAtINC/0YDQsNGG0Y7RlAovLyAgIDIgKiB4IC0g0L3QtSDQv9GA0LDRhtGO0ZQs0Y/QutGJ0L4g0L7Qv9C10YDQsNGG0YvRjyDQvtCz0L7Qu9C+0YjQtdC90LAg0Y/QuiDQvNC10YLQvtC0INC60LvQsNGB0YMsINCwINC90LUgZnJpZW5kINGE0YPQvdC60YbRltGPICAKLy8JY29uc3QgRnJhY3Rpb24gb3BlcmF0b3IqKGNvbnN0IEZyYWN0aW9uICYgeSkgeyByZXR1cm4gRnJhY3Rpb24obiAqIHkubiwgZCAqIHkuZCk7CX0KCWZyaWVuZCBGcmFjdGlvbiBvcGVyYXRvciooY29uc3QgRnJhY3Rpb24gJiwgY29uc3QgRnJhY3Rpb24gJik7Cgljb25zdCBGcmFjdGlvbiBvcGVyYXRvci8oY29uc3QgRnJhY3Rpb24gJiB5KSB7IHJldHVybiBGcmFjdGlvbihuICogeS5kLCBkICogeS5uKTsJfQoJCgkKCQovLwljb25zdCBGcmFjdGlvbiBvcGVyYXRvcisoY29uc3QgIEZyYWN0aW9uICYgcmhzKSB7ICAKCQkvL3JldHVybiBGcmFjdGlvbih0aGlzLT5uICogcmhzLmQgKyB0aGlzLT5kICogcmhzLm4sIHRoaXMtPmQgKiByaHMuZCk7IH0KCQoJCgljb25zdCBGcmFjdGlvbiBvcGVyYXRvci0oY29uc3QgRnJhY3Rpb24gJiB5KSB7IHJldHVybiBGcmFjdGlvbihuICogeS5kIC0gZCAqIHkubiwgZCAqIHkuZCk7IH0KCWNvbnN0IEZyYWN0aW9uIG9wZXJhdG9yKyhjb25zdCBGcmFjdGlvbiAmIHkpIHsgcmV0dXJuIEZyYWN0aW9uKG4gKiB5LmQgKyBkICogeS5uLCBkICogeS5kKTsgfQoJY29uc3QgRnJhY3Rpb24gb3BlcmF0b3IqKGNvbnN0IEZyYWN0aW9uICYgeSkgeyByZXR1cm4gRnJhY3Rpb24obiAgKiB5Lm4sIGQgKiB5LmQpOyB9CgkKCQoJY29uc3QgRnJhY3Rpb24gb3BlcmF0b3ItKCkgeyByZXR1cm4gRnJhY3Rpb24oLW4sIGQpOyB9IAoJRnJhY3Rpb24gb3BlcmF0b3IqPShjb25zdCBGcmFjdGlvbiAmIHkpIHsgbiAqPSB5Lm47IGQgKj0geS5kOyByZXN0cmljdCgpOyByZXR1cm4gKnRoaXM7fQoJRnJhY3Rpb24gb3BlcmF0b3IrKygpIHsgbiArPSBkOyByZXR1cm4gKnRoaXM7fQoJCgljb25zdCBGcmFjdGlvbiBvcGVyYXRvcisrKGludCkge24gKz0gZDsgcmV0dXJuIEZyYWN0aW9uKG4tZCwgZCk7IH0gCgkKCQoJZnJpZW5kIHN0ZDo6b3N0cmVhbSAmICBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmLCBjb25zdCBGcmFjdGlvbik7CgkKCQoJCgkKCQoJZnJpZW5kIHN0ZDo6aXN0cmVhbSAmIG9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSAmLCBGcmFjdGlvbiAmKTsKCQoJaW50IHN1bShpbnQgYil7CglyZXR1cm4gdGhpcy0+bitiOwp9CgoJCn07CgpjbGFzcyBUOnB1YmxpYyBGcmFjdGlvbnsKCXByaXZhdGU6CgkgaW50IHc7CgkgcHVibGljOgoJIFQoaW50IGMsaW50IG4saW50IGQpOkZyYWN0aW9uKGMqZCtuLGQpewoJIAkKCSB9Cn07CkZyYWN0aW9uIG9wZXJhdG9yKihjb25zdCBGcmFjdGlvbiAmIHgsIGNvbnN0IEZyYWN0aW9uICYgeSkgeyByZXR1cm4gRnJhY3Rpb24oeC5uICogeS5uLCB4LmQgKiB5LmQpOyB9CgpzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0gJiBvdXQsIGNvbnN0IEZyYWN0aW9uIHgpIHsKCW91dCA8PCB4Lm4gPDwgIi8iIDw8IHguZDsKCS8vb3V0PDwiSGVsbG8iOwoJcmV0dXJuIG91dDsKfQogCnN0ZDo6aXN0cmVhbSAmIG9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSAmIGluLCBGcmFjdGlvbiAmIHgpIHsKCWludCBOLCBEOwoJaW4gPj4gTiA+PiBEOwoJeCA9IEZyYWN0aW9uKE4sIEQpOwoJcmV0dXJuIGluOwp9CgoKaW50IG1haW4oKSB7CgkgRnJhY3Rpb24geCgxLDMpLHkoMSwyKTsKCSBjb3V0PDx5K3g8PGVuZGw7CgkgY291dDw8LXg8PGVuZGw7CgkgY291dDw8eTsKLy8JIGNvdXQ8PHgreTw8IjEyMyI7Ci8vCSBjb3V0PDx5PDxlbmRsOwovL2NvdXQ8PGVuZGw7CgkgLy9jb3V0PDx4LnN1bSg1KTsKCS8vIGNvdXQgPDwgMiAqIHkgPDwgJ1xuJzsgLy/Rh9C+0LzRgyDRgtGD0YIg0L3QtdC80LDRlCDQv9C+0LzQuNC70LrQuCwg0Y/QuiDQv9GA0LDRhtGO0ZQ/CgkvLyBjaW4gPj4gejsgCgkvLyBjb3V0PDx6PDxlbmRsOwoJLy8gc3RkOjpjb3V0IDw8IHggKyB5IDw8ICdcbic7CgkvLyB6ICo9IDI7CgkvLyBzdGQ6OmNvdXQgPDwgeiA8PCAnXG4nOyAKCS8vIHN0ZDo6Y291dCA8PCArK3ogPDwgJ1xuJzsgCgkvLyBzdGQ6OmNvdXQgPDwgeisrIDw8ICdcbic7IAoJLy8gc3RkOjpjb3V0IDw8IHogPDwgJ1xuJzsgCgkvLyBUIHQoMSwyLDMpOwoJLy8gc3RkOjpjb3V0PDx0Owp9CgovKgrQn9C70LDQvToKKy4tLCouLywgJS4gKwoKMS4g0LzRltC90YPRgSAKMi4g0KPQvdCw0YDQvdC90LjQuSDQvNGW0L3Rg9GBCjMuIHggKj0gMgo0LiArK3gsIHgrKwo1LiAyICsgeAoqLw==