#include <iostream>
using namespace std;


class Rational
{
public:
    Rational(int = 0, int = 1); // default constructor
    Rational addition(const Rational&); 
    Rational subtraction(const Rational&); 
    Rational multiplication(const Rational&); 
    Rational division(const Rational&); 
    void printRational(); 
    void printRationalAsdouble(); 

private:
    int numerator; 
    int denominator; 
    void reduction(); // function to reduce using great common divisor 

}; 


Rational::Rational(int n, int d)
{
	numerator = n; 
	denominator = d; 
	reduction(); 
} 


Rational Rational::addition(const Rational& a)
{
	Rational t; 
	
	t.numerator = a.numerator * denominator; 
	t.numerator += a.denominator * numerator; 
	t.denominator = a.denominator * denominator; 
	t.reduction();
	return t; 

} 

Rational Rational::subtraction(const Rational& s)
{
	Rational t;
	t.numerator = s.numerator * denominator; 
	t.numerator -= denominator * s.numerator; 
	t.denominator = s.denominator * denominator; 
	return t; 

}  

Rational Rational::multiplication(const Rational& m)
{
	Rational t; 
	t.numerator = m.numerator * numerator; 
	t.denominator = m.denominator * denominator; 
	t.reduction(); 
	return t; 	
} 

Rational Rational::division(const Rational& v)
{
	Rational t; 
	t.numerator = numerator * v.denominator; 
	t.denominator = denominator * v.numerator; 
	t.reduction(); 
	return t; 

} 


void Rational::printRational()
{
	if (denominator == 0) 
		cout << "\nDIVIDE BY ZERO ERROR!!!" << "\n";
	else if (numerator == 0) 
		cout << 0;
	else
		cout << numerator << '/' << denominator; 
} 


void Rational::printRationalAsdouble()
{
	cout << static_cast<double>(numerator) / denominator; 
} 

void Rational::reduction()
{
	int largest; 

	largest = numerator > denominator ? numerator : denominator; 


	for (int loop = 2; loop <= largest; loop++)
	{
			for (int loop = 2; loop <= largest; loop++)
    		{
        		if (numerator % loop == 0 && denominator % loop == 0)
        		{
            		numerator /= loop; 
            		denominator /= loop; 
        		} 
    		}

	}

} 


int main()
{
	Rational obj1(8, 14), obj2(5, 7), resobj; 

	obj1.printRational(); 
	cout << " + ";
	obj2.printRational(); 
	resobj = obj1.addition(obj2); 

	cout << " = "; 
	resobj.printRational(); 
	


} 