#include <iostream>
#include <cassert>

using namespace std;

void Add(int num1, int den1, int num2, int den2, int & result_num, int & result_den);

void Sub(int num1, int den1, int num2, int den2, int& result_num, int& result_den);

void Mpy(int num1, int den1, int num2, int den2, int& result_num, int& result_den);

void Div(int num1, int den1, int num2, int den2, int result_num, int result_den);

int lcm(int m, int n);

int gcd(int n, int m);

void Reduction(int num, int den, int& result_num, int& result_den);  //reduction함수의 첫번째 두번째 인자는 사칙연산의 결과의 분자/분모이다.

int main()
{
	
	int a, b, c, d;
	
	int resultNum, resultDen;

	cout << "분자/분모를 차례대로 입력하시오(분모에 0넣으면 Error!)" << endl;
	cout << "(음수인 분수는 분자에 음수를 입력해주세요 !!  : ";
	cin >> a >> b >> c >> d;

	assert(b != 0 && d != 0);

	/*모든 사칙연산 계산 함수에 자동 약분까지 되어 산출*/
	Add(a, b, c, d, resultNum, resultDen); //덧셈

	Sub(a, b, c, d, resultNum, resultDen); //뺄셈

    Mpy(a, b, c, d, resultNum, resultDen); //곱셈

    Div(a, b, c, d, resultNum, resultDen); //나눗셈

	cout << endl;  // 깔끔한 개행

	return 0; // 종료
}
void Add(int num1, int den1, int num2, int den2, int & result_num, int & result_den)
{

	int add_num, add_den;
	result_den = lcm(den1, den2);
	result_num = (result_den / den1)*num1 + (result_den / den2)*num2;

	if (result_den < 0 && result_num>0)
	{
		int minus_to_plus_den = -result_den;
		Reduction(result_num, minus_to_plus_den, add_num, add_den);
	}
	else if (result_num < 0 && result_num>0)
	{
		int minus_to_plus_num = -result_num;
		Reduction(minus_to_plus_num, result_den, add_num, add_den);
	}
	else if (result_den < 0 && result_num < 0)
	{
		result_den = -result_den;
		result_num = -result_num;
		Reduction(result_num, result_den, add_num, add_den);
	}
	//조건 : 연산만되고 약분이안된 분수의 분자, 분모의 음수 여부를 체크한다  이유는 약분하는 함수(Reduction)에 gcd가 필요한데 음수가 있으면 gcd가 돌아가지를 않는다
	//       그래서 일단 지역변수선언해서 그 지역변수의 연산만된 분수를 양수화 하고 약분하는 함수에 넣는다. Reduction에 넣으면 약분이 되어 참조자로 주소값이 참조되어 빠져나온다.
	
	if (result_num % result_den == 0)  // 약분했는데 분모가 분자로 나눠지는경우와 분모가 1인경우 분수를 정수로 표현하는 조건이다.
	{
		cout << "(" << num1 << "/" << den1 << ")+" << "(" << num2 << "/" << den2 << ")=" << result_num/result_den << endl;
	}
	else  
	{
		cout << "(" << num1 << "/" << den1 << ")+" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
	}
	
}

void Sub(int num1, int den1, int num2, int den2, int& result_num, int& result_den){

	int sub_num, sub_den;
	result_den = lcm(den1, den2);
	result_num = (result_den / den1)*num1 - (result_den / den2)*num2;


	if (result_den < 0 && result_num>0)
	{
		int minus_to_plus_den = -result_den;
		Reduction(result_num, minus_to_plus_den, sub_num, sub_den);
	}
	else if (result_num < 0 && result_num>0)
	{
		int minus_to_plus_num = -result_num;
		Reduction(minus_to_plus_num, result_den, sub_num, sub_den);
	}
	else if (result_den < 0 && result_num < 0)
	{
		result_den = -result_den;
		result_num =-result_num;
		Reduction(result_num, result_den, sub_num, sub_den);
	}



	if (result_num % result_den == 0)
	{
		cout << "(" << num1 << "/" << den1 << ")-" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
	}
	else{
		cout << "(" << num1 << "/" << den1 << ")-" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
	}
}
void Mpy(int num1, int den1, int num2, int den2, int& result_num, int& result_den){


	int mpy_num, mpy_den;
	result_num = num1*num2;
	result_den = den1*den2;


	if (result_den < 0 && result_num > 0)
	{
		int minus_to_plus_den = -result_den;
		Reduction(result_num, minus_to_plus_den, mpy_num, mpy_den);
	}
	else if (result_num < 0 && result_num > 0)
	{
		int minus_to_plus_num = -result_num;
		Reduction(minus_to_plus_num, result_den, mpy_num, mpy_den);
	}
	else if (result_den < 0 && result_num < 0)
	{
		result_den = -result_den;
		result_num = -result_num;
		Reduction(result_num, result_den, mpy_num, mpy_den);
	}




	if (result_num % result_den == 0)
	{
		cout << "(" << num1 << "/" << den1 << ")*" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
	}
	else
	{
		cout << "(" << num1 << "/" << den1 << ")*" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
	}
}


void Div(int num1, int den1, int num2, int den2, int result_num, int result_den){

	
	int div_num, div_den;
	result_num = num1*den2;
	result_den = num2*den1;
	if (result_den < 0 && result_num>0) 
	{
		int minus_to_plus_den = -result_den;
		Reduction(result_num, minus_to_plus_den, div_num, div_den);
	}
	else if (result_num < 0 && result_num>0)
	{
		int minus_to_plus_num = -result_num;
		Reduction(minus_to_plus_num, result_den, div_num, div_den);
	}
	else if (result_den < 0 && result_num < 0)
	{
		result_den = -result_den;
		result_num = -result_num;
		Reduction(result_num, result_den, div_num, div_den);
	}
	if (result_num % result_den == 0)
	{
		cout << "(" << num1 << "/" << den1 << ")/" << "(" << num2 << "/" << den2 << ")=" << result_num / result_den << endl;
	}
	else
	{
		cout << "(" << num1 << "/" << den1 << ")/" << "(" << num2 << "/" << den2 << ")=" << result_num << "/" << result_den << endl;
	}
}

int lcm(int m, int n){

	
	int m1 = m / gcd(n, m);  // 최소공배수 통분했을때 나오는 최대공약수 제외한 나머지 값
	int n1 = n / gcd(n, m);

	return gcd(n, m) * m1 * n1;  // 최대 공약수 랑 통분했을 시 나오는 수들의 곱셈
}

int gcd(int n, int m) {

		if (m > n)
		{
			int temp;
			temp = n;
			n = m;
			m = temp;

			if (m == 0){
				return n;
			}
			else
			{
				return gcd(m, n%m);
			}

	    }
		else
		{
			if (m == 0)
				return n;
			else
				return gcd(m, n%m);

		}

	}




void Reduction(int num, int den, int& result_num, int& result_den)  //reduction함수의 첫번째 두번째 인자는 사칙연산의 결과의 분자/분모이다.
{

	gcd(num, den);

	result_num = num / gcd(num, den);

	result_den = den / gcd(num, den);


	if (result_den == result_num)
	{
		result_den = 1;
		result_num = 1;

	}


}
//// Reduction 함수가 안돌아가는거같음... 약분이 안됨......

