#include <stdio.h>
#include <math.h>
#include <string>
int lcm(int a, int b) {
int na = 1, nb = 1;
while (a * na != b * nb) {
if (a * na < b * nb) ++na; else ++nb;
}
return a * na;
}
int gcm(int a, int b) {
int i = a < b ? a : b;
for (; i > 1; --i) {
if (a % i == 0 && b % i == 0) break;
}
return i;
}
class Frac {
private:
int a, b;
public:
Frac(int num) {
a = num;
b = 1;
}
Frac(int num, int den) {
a = num;
b = den;
}
Frac(const Frac &f) {
*this = f;
}
Frac &operator=(const Frac &f) {
a = f.a;
b = f.b;
return *this;
}
Frac &operator+=(const Frac &f) {
Frac tmp = *this;
b = lcm(tmp.b, f.b);
a = tmp.a * b / tmp.b + f.a * b / f.b;
return *this;
}
Frac &operator*=(const Frac &f) {
a *= f.a;
b *= f.b;
return *this;
}
Frac reduce() const {
Frac ret = *this;
int g = gcm(a, b);
ret.a /= g;
ret.b /= g;
return ret;
}
std::string str() const {
char buf[32];
if (b == 1) {
snprintf(buf, sizeof(buf), "%d", a);
} else {
snprintf(buf, sizeof(buf), "%d/%d", a, b);
}
return buf;
}
};
Frac operator+(const Frac &f1, const Frac &f2) {
Frac ret = f1;
ret += f2;
return ret;
}
Frac operator*(const Frac &f1, const Frac &f2) {
Frac ret = f1;
ret *= f2;
return ret;
}
int main() {
Frac a(1, 2);
Frac b(1, 3);
Frac c = a + b;
Frac d = a * b;
Frac e = d * 15;
Frac f = e.reduce();
Frac g = f * 2;
Frac h = g.reduce();
printf("a = %s\n", a.str().c_str());
printf("b = %s\n", b.str().c_str());
printf("c = %s\n", c.str().c_str());
printf("d = %s\n", d.str().c_str());
printf("e = %s\n", e.str().c_str());
printf("f = %s\n", f.str().c_str());
printf("g = %s\n", g.str().c_str());
printf("h = %s\n", h.str().c_str());
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdHJpbmc+CgppbnQgbGNtKGludCBhLCBpbnQgYikgewogICAgaW50IG5hID0gMSwgbmIgPSAxOwogICAgd2hpbGUgKGEgKiBuYSAhPSBiICogbmIpIHsKICAgICAgICBpZiAoYSAqIG5hIDwgYiAqIG5iKSArK25hOyBlbHNlICsrbmI7CiAgICB9CiAgICByZXR1cm4gYSAqIG5hOwp9CgppbnQgZ2NtKGludCBhLCBpbnQgYikgewogICAgaW50IGkgPSBhIDwgYiA/IGEgOiBiOwogICAgZm9yICg7IGkgPiAxOyAtLWkpIHsKICAgICAgICBpZiAoYSAlIGkgPT0gMCAmJiBiICUgaSA9PSAwKSBicmVhazsKICAgIH0KICAgIHJldHVybiBpOwp9CgpjbGFzcyBGcmFjIHsKcHJpdmF0ZToKICAgIGludCBhLCBiOwoKcHVibGljOgogICAgRnJhYyhpbnQgbnVtKSB7CiAgICAgICAgYSA9IG51bTsKICAgICAgICBiID0gMTsKICAgIH0KCiAgICBGcmFjKGludCBudW0sIGludCBkZW4pIHsKICAgICAgICBhID0gbnVtOwogICAgICAgIGIgPSBkZW47CiAgICB9CgogICAgRnJhYyhjb25zdCBGcmFjICZmKSB7CiAgICAgICAgKnRoaXMgPSBmOwogICAgfQoKICAgIEZyYWMgJm9wZXJhdG9yPShjb25zdCBGcmFjICZmKSB7CiAgICAgICAgYSA9IGYuYTsKICAgICAgICBiID0gZi5iOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBGcmFjICZvcGVyYXRvcis9KGNvbnN0IEZyYWMgJmYpIHsKICAgICAgICBGcmFjIHRtcCA9ICp0aGlzOwogICAgICAgIGIgPSBsY20odG1wLmIsIGYuYik7CiAgICAgICAgYSA9IHRtcC5hICogYiAvIHRtcC5iICsgZi5hICogYiAvIGYuYjsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgRnJhYyAmb3BlcmF0b3IqPShjb25zdCBGcmFjICZmKSB7CiAgICAgICAgYSAqPSBmLmE7CiAgICAgICAgYiAqPSBmLmI7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIEZyYWMgcmVkdWNlKCkgY29uc3QgewogICAgICAgIEZyYWMgcmV0ID0gKnRoaXM7CiAgICAgICAgaW50IGcgPSBnY20oYSwgYik7CiAgICAgICAgcmV0LmEgLz0gZzsKICAgICAgICByZXQuYiAvPSBnOwogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QgewogICAgICAgIGNoYXIgYnVmWzMyXTsKICAgICAgICBpZiAoYiA9PSAxKSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsIGEsIGIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmOwogICAgfQp9OwoKRnJhYyBvcGVyYXRvcisoY29uc3QgRnJhYyAmZjEsIGNvbnN0IEZyYWMgJmYyKSB7CiAgICBGcmFjIHJldCA9IGYxOwogICAgcmV0ICs9IGYyOwogICAgcmV0dXJuIHJldDsKfQoKRnJhYyBvcGVyYXRvciooY29uc3QgRnJhYyAmZjEsIGNvbnN0IEZyYWMgJmYyKSB7CiAgICBGcmFjIHJldCA9IGYxOwogICAgcmV0ICo9IGYyOwogICAgcmV0dXJuIHJldDsKfQoKaW50IG1haW4oKSB7CiAgICBGcmFjIGEoMSwgMik7CiAgICBGcmFjIGIoMSwgMyk7CiAgICBGcmFjIGMgPSBhICsgYjsKICAgIEZyYWMgZCA9IGEgKiBiOwogICAgRnJhYyBlID0gZCAqIDE1OwogICAgRnJhYyBmID0gZS5yZWR1Y2UoKTsKICAgIEZyYWMgZyA9IGYgKiAyOwogICAgRnJhYyBoID0gZy5yZWR1Y2UoKTsKICAgIHByaW50ZigiYSA9ICVzXG4iLCBhLnN0cigpLmNfc3RyKCkpOwogICAgcHJpbnRmKCJiID0gJXNcbiIsIGIuc3RyKCkuY19zdHIoKSk7CiAgICBwcmludGYoImMgPSAlc1xuIiwgYy5zdHIoKS5jX3N0cigpKTsKICAgIHByaW50ZigiZCA9ICVzXG4iLCBkLnN0cigpLmNfc3RyKCkpOwogICAgcHJpbnRmKCJlID0gJXNcbiIsIGUuc3RyKCkuY19zdHIoKSk7CiAgICBwcmludGYoImYgPSAlc1xuIiwgZi5zdHIoKS5jX3N0cigpKTsKICAgIHByaW50ZigiZyA9ICVzXG4iLCBnLnN0cigpLmNfc3RyKCkpOwogICAgcHJpbnRmKCJoID0gJXNcbiIsIGguc3RyKCkuY19zdHIoKSk7Cn0K