package com.company;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.List;
import java.util.HashMap;
public class MyFraction {
int numerator;
int denominator;
public MyFraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
MyFraction add(MyFraction fraction2) {
int numerator = this.numerator * fraction2.denominator + fraction2.numerator * this.denominator;
int denominator = this.denominator * fraction2.denominator;
MyFraction fraction = new MyFraction(numerator, denominator);
fraction.simpleFraction();
return fraction;
}
MyFraction subtract(MyFraction fraction2) {
int numerator = this.numerator * fraction2.denominator - fraction2.numerator * this.denominator;
int denominator = this.denominator * fraction2.denominator;
MyFraction fraction = new MyFraction(numerator, denominator);
fraction.simpleFraction();
return fraction;
}
public void simpleFraction() {
int greatestCommonDivisor = this.greatestCommonDivisor();
this.numerator = this.numerator / greatestCommonDivisor;
this.denominator = this.denominator / greatestCommonDivisor;
}
int greatestCommonDivisor() {
List<Integer> primeListNumerator = primeFactorizationList(this.numerator);
List<Integer> primeListDenominator = primeFactorizationList(this.denominator);
HashMap<Integer, Integer> primeFactorizationHashNumerator = new HashMap<Integer, Integer>();
for (Integer primeNumberInNumerator : primeListNumerator) {
int n;
if (!primeFactorizationHashNumerator.containsKey(primeNumberInNumerator)) {
n = 1;
} else {
n = primeFactorizationHashNumerator.get(primeNumberInNumerator) + 1;
}
primeFactorizationHashNumerator.put(primeNumberInNumerator, n);
}
HashMap<Integer, Integer> primeFactorizationHashDenominator = new HashMap<Integer, Integer>();
for (Integer primeNumberInDenominator : primeListDenominator) {
int n;
if (!primeFactorizationHashDenominator.containsKey(primeNumberInDenominator)) {
n = 1;
} else {
n = primeFactorizationHashDenominator.get(primeNumberInDenominator) + 1;
}
primeFactorizationHashDenominator.put(primeNumberInDenominator, n);
}
int greatestCommonDivisor = 1;
Iterator it = primeFactorizationHashNumerator.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
int number = (int) pair.getKey();
int exponentiation1 = (int) pair.getValue();
int exponentiation = 0;
if (primeFactorizationHashDenominator.get(number) != null) {
int exponentiation2 = primeFactorizationHashDenominator.get(number);
exponentiation = exponentiation1 > exponentiation2 ? exponentiation2 : exponentiation1;
}
if (exponentiation > 0) {
greatestCommonDivisor = greatestCommonDivisor * exponentiationNumber(number, exponentiation);
}
}
return greatestCommonDivisor;
}
public int exponentiationNumber(int number, int exponentiation) {
int n = exponentiation - 1;
int result = number;
while (n > 0) {
result = result * number;
n = n - 1;
}
return result;
}
public List<Integer> primeFactorizationList(int number) {
List<Integer> primeNumberList = primeNumberList(number);
List<Integer> primeFactorizationList = new ArrayList<Integer>();
if (isPrime(number, primeNumberList)) {
primeFactorizationList.add(number);
} else {
int n = number;
for (int i = 0; i < primeNumberList.size(); i++) {
int primeNumber = primeNumberList.get(i);
while (n % primeNumber == 0) {
primeFactorizationList.add(primeNumber);
n = n / primeNumber;
}
}
}
return primeFactorizationList;
}
public List<Integer> primeNumberList(int number) {
List<Integer> primeNumberList = new ArrayList<Integer>();
for (int i = 2; i <= number; i++) {
if (isPrime(i, primeNumberList)) {
primeNumberList.add(i);
}
}
return primeNumberList;
}
public boolean isPrime(int number, List<Integer> primeNumberList) {
if (primeNumberList.contains(number)) {
return true;
}
for (Integer integer : primeNumberList) {
if (number % integer == 0) {
return false;
}
}
return true;
}
void println() {
System.out.println(this.numerator + "/" + this.denominator);
}
}