#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

#include "ratio.h"

static INT mcd(INT a, INT b)
{
   if (a<0) a= -a;
   if (b<0) b= -b;

   if (b==0)
      return a;
   else
      return mcd(b, a%b);
}

ratio::ratio(INT n, INT d)
{
   if (d==0) 
      d= 1;
   if (d<0)
      {
       d= -d;
       n= -n;
      }
   INT m= mcd(n,d);
   num= n/m;
   den= d/m;
}


INT ratio::N(void) const
{
  return num;
}

INT ratio::D(void) const
{
  return den;
}


ratio operator + (const ratio& a, const ratio& b)
{
   INT d= a.D() * ( b.D() / mcd( a.D(), b.D() ));
   INT n= (d/a.D()) * a.N()   +   (d/b.D()) * b.N();
   return ratio(n,d);
}

ratio operator - (const ratio& a, const ratio& b)
{
   INT d= a.D() * ( b.D() / mcd( a.D(), b.D() ));
   INT n= (d/a.D()) * a.N()   -   (d/b.D()) * b.N();
   return ratio(n,d);
}

ratio operator - (const ratio& a)
{
   return ratio( -a.N(), a.D() );
}

ratio operator * (const ratio& a, const ratio& b)
{
   INT d= a.D() *  b.D();
   INT n= a.N() *  b.N();
   return ratio(n,d);
}


ratio operator / (const ratio& a, const ratio& b)
{
   INT d= a.D() *  b.N();
   INT n= a.N() *  b.D();
   return ratio(n,d);
}


ratio abs(const ratio a)
{
   if (a.N() < 0)
      return ratio( -a.N(), a.D() );
   else
      return a;
}


bool operator < (const ratio& a, const ratio& b)
{
   return a.N() * b.D() < b.N() * a.D();
}

bool operator > (const ratio& a, const ratio& b)
{
   return a.N() * b.D() > b.N() * a.D();
}

bool operator == (const ratio& a, const ratio& b)
{
   return a.N() == b.N()  && a.D() == b.D();
}

bool operator <= (const ratio& a, const ratio& b)
{
   return a.N() * b.D() <= b.N() * a.D();
}

bool operator >= (const ratio& a, const ratio& b)
{
   return a.N() * b.D() >= b.N() * a.D();
}


ostream& operator << (ostream& os, const ratio& a)
{
    os << a.N();
    if (a.D() != 1)
       os << "/" << a.D();
    return os;
}

istream& operator >> (istream& is, ratio& a)
{
   INT n, d;
   is >> n;
   if (is.peek() == '/')
      {
       is.get();
       is >> d;
      }
   else
      d= 1;
   a= ratio(n,d);
   return is;
}

