#include #include "frac.h" /* int main() { frac a, b, c; a.set(3,5); b.set(-4,5); cout << b.sign << ' ' << b.upper << '/' << b.lower << endl; c = a * b; cout << c.sign << ' ' << c.upper << "/" << c.lower << endl; c = a / b; cout << c.sign << ' ' << c.upper << "/" << c.lower << endl; a.set(-3, 2); b.set(1, 3); c = a * b; cout << c.sign << ' ' << c.upper << "/" << c.lower << endl; a.set(-1, 2); b.set(1, 3); c = a * b; cout << c.sign << ' ' << c.upper << "/" << c.lower << endl; return 0; } */ unsigned int frac::gcd(unsigned int a, unsigned int b) { if (a == 0) { return b; } if (b == 0) { return a; } if (a < b) { return gcd(a, b%a); } else { return gcd(b, a%b); } } void frac::set(int u, unsigned int l) { if (u < 0) { sign = 1; upper = -u; } else { sign = 0; upper = u; } lower = l; return; } frac::frac(int i) { if (i < 0) { sign = 1; upper = -i; } else { sign = 0; upper = i; } lower = 1; } frac::frac(int u, unsigned int l) { if (u < 0) { sign = 1; upper = -u; } else { sign = 0; upper = u; } lower = l; } frac frac::operator + (frac src) { frac ans; int buf; ans.lower = lower * src.lower; ans.upper = upper * src.lower; ans.sign = sign; src.lower *= lower; src.upper *= lower; switch (ans.sign) { case 0: switch (src.sign) { case 0: // ans->'+', src->'+' ans.upper += src.upper; ans.sign = 0; break; default: // ans->'+', src->'-' if (ans.upper < src.upper) { ans.sign = 1; ans.upper = src.upper - ans.upper; } else { ans.sign = 0; ans.upper -= src.upper; } } break; default: switch (src.sign) { case 0: // upper->'-', lower->'+' if (ans.upper < src.upper) { ans.sign = 0; ans.upper = src.upper - ans.upper; } else { ans.sign = 1; ans.upper -= src.upper; } break; default: // upper->'-', lower->'-' ans.upper += src.upper; ans.sign = 1; break; } } simplize(&ans); return ans; } frac frac::operator - (frac src) { src.sign = !src.sign; return *this + src; } frac frac::operator * (frac src) { frac ans; ans.upper = upper * src.upper; ans.lower = lower * src.lower; if (sign == 0) { if (src.sign == 0) { ans.sign = 0; } else { ans.sign = 1; } } else { if (src.sign == 0) { ans.sign = 1; } else { ans.sign = 0; } } simplize(&ans); return ans; } frac frac::operator / (frac src) { frac buf; buf.sign = src.sign; buf.upper = src.lower; buf.lower = src.upper; return *this * buf; } void frac::simplize(frac *f) { unsigned int buf; if (f->upper == 0) { f->lower = 1; f->sign = 0; } else { buf = gcd(f->upper, f->lower); f->lower /= buf; f->upper /= buf; } return; }