#include <iostream>
#include <cassert>

using namespace std;

// naglowek (plik *.hpp)
class TUlamek
{
   private:
      int m_p,m_q;
      int NWD(int a, int b);
   public:
      TUlamek();
      TUlamek(int, int =1);
      ~TUlamek();
      TUlamek operator*(const TUlamek &u);
      friend TUlamek operator+(const TUlamek &u1, const TUlamek &u2);
      friend ostream& operator<< (ostream &o, const TUlamek &u);
      static int N;
      static int M;
};
//========================================================

int main()
{
   TUlamek u1(2,5),u2(1,3);

   cout << u1 << " * " << u2 << " = " << u1*u2 << "\n";
   cout << u1 << " + " << u2 << " = " << u1+u2 << "\n";
//---------------------
   TUlamek u;
   for(int i=1; i<=4; ++i)
   {
      TUlamek r(i,i+1);
      u = u+r;
      cout << r << "  ";
   }
   cout << " = ";
   cout << u << "\n";
   cout << "N: " << TUlamek::N << "\n";
   cout << "M: " << TUlamek::M << "\n";
   return 0;
}

// implementacja (plik *.cpp)
int TUlamek::NWD(int a, int b)
{
   for(int r=a%b; r!=0; r=a%b)
   {
      a = b;
      b = r;
   }
   return b;
}

TUlamek::TUlamek()
{
   ++N;
   m_p = 0;
   m_q = 1;
}

TUlamek::TUlamek(int p, int q)
{
   ++M;
   assert(q!=0);
   if(p==0)
   {
      m_p = 0;
      m_q = 1;
      return;
   }
   int r=NWD(p,q);
   m_p = p/r;
   m_q = q/r;
}

TUlamek::~TUlamek()
{
}

TUlamek TUlamek::operator*(const TUlamek &u)
{
   return TUlamek(m_p*u.m_p, m_q*u.m_q);
}

TUlamek operator+(const TUlamek &u1, const TUlamek &u2)
{
   return TUlamek(u1.m_p*u2.m_q+u2.m_p*u1.m_q, u1.m_q*u2.m_q);
}

ostream& operator<< (ostream &o, const TUlamek &u)
{
   o << "[" << u.m_p << "/" << u.m_q << "]";
   return o;
}

int TUlamek::N = 0;
int TUlamek::M = 0;
//========================================================
