package fracCalc;

import java.util.Scanner;
 
public class fraction {
 
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
 
		System.out.print("Enter a fraction: ");
		String input = scanner.nextLine();
 
		// loop until user enters 'quit'
		while (!input.equalsIgnoreCase("quit")) {
			System.out.println(produceAnswer(input));
			System.out.print("Enter a fraction: ");
			input = scanner.nextLine();
		}
 
		System.out.println("Goodbye!");
		scanner.close();
 
	}
 
	private static String produceAnswer(String input) {
 
		// parse input
		String t[] = input.split(" ");
		if (t.length != 3) return "Check format!";
		MixedFraction a = parseFraction(t[0]);
		a.check();
		String operator = t[1];
		MixedFraction b = parseFraction(t[2]);
		b.check();
 
		MixedFraction result;
 
		//addition
		switch(operator) {
			case "+":
				result = a.add(b);
				break;
			case "-":
				result = a.subtract(b);
				break;
			case "*":
				result = a.multiply(b);
				break;
			case "/":
				result = a.divide(b);
				break;
			default:
				return a + " " + operator + " " + b + " = " + result;
		}
		
	}
 //parse
	private static MixedFraction parseFraction(String fraction) {
 
		MixedFraction mf = new MixedFraction();
 
		String[] t;
		if (fraction.contains("_")) {
			t = fraction.split("_");
			mf.number = Integer.parseInt(t[0]);
			fraction = t[1];
		}
		else mf.number = 0;
 
		t = fraction.split("/");
		mf.num = Integer.parseInt(t[0]);
		mf.denom = Integer.parseInt(t[1]);
		return mf;
	}
 
}
 
class MixedFraction {
	public int number, num, denom;
 
	public MixedFraction() {
		number = 0;
		num = 0;
		denom = 0;
	}
	
	private int gcd(int a, int b) {
		while (b != 0) {
			int t = b;
			b = a % b;
			a = t;
		}
		return a;
	}
 
	private int lcm(int a, int b) {
		return Math.abs(a * b) / gcd(a, b);
	}
 
	public void check() {
		if (this.num <= this.denom) return;
		this.number += this.num / this.denom;
		this.num = this.num % this.denom;
	}
	public String toString() {
		return (number != 0 ? number + "_" : "") + num + "/" + denom;
	}
 //adding the fractions
	public MixedFraction add(MixedFraction b) {
		MixedFraction mf = new MixedFraction();
		int a_num = this.num + this.number * this.denom;
		int b_num = b.num + b.number * b.denom;
		int lcm = lcm(this.denom, b.denom);
		a_num *= lcm / this.denom;
		b_num *= lcm / b.denom;
		mf.num = a_num + b_num;
		mf.denom = lcm;
		mf.check();
		return mf;
	}

	//multiply the fractions
	public MixedFraction multiply(MixedFraction b) {
		MixedFraction mf = new MixedFraction();
		int a_num = this.num * this.number * this.denom;
		int b_num = b.num * b.number * b.denom;
		int lcm = lcm(this.denom, b.denom);
		a_num *= lcm / this.denom;
		b_num *= lcm / b.denom;
		mf.num = a_num * b_num;
		mf.denom = lcm;
		mf.check();
		return mf;
	}
	
	//subtract the fractions
	public MixedFraction subtract(MixedFraction b) {
		MixedFraction mf = new MixedFraction();
		int a_num = this.num - this.number * this.denom;
		int b_num = b.num - b.number - b.denom;
		int lcm = lcm(this.denom, b.denom);
		a_num *= lcm / this.denom;
		b_num *= lcm / b.denom;
		mf.num = a_num - b_num;
		mf.denom = lcm;
		mf.check();
		return mf;
	}
	//divide the fractions
	public MixedFraction divide(MixedFraction b) {
		MixedFraction mf = new MixedFraction();
		int a_num = this.num - this.number * this.denom;
		int b_num = b.num / b.number / b.denom;
		int lcm = lcm(this.denom, b.denom);
		a_num *= lcm / this.denom;
		b_num *= lcm / b.denom;
		mf.num = a_num / b_num;
		mf.denom = lcm;
		mf.check();
		return mf;
}
}