/** * Each Fraction object represents an immutable rational number with a numerator and denominator. * Fractions are always stored in reduced form such that the GCD of their * numerator and denominator is always 1. * * @pre to all methods: valid arguments (I know, I know...) * @author Marty Stepp */ public final class Fraction implements Comparable { private final int numerator; private final int denominator; public Fraction(int numerator) { this(numerator, 1); } public Fraction(int numerator, int denominator) { // reduce the fraction before storing it int g = gcd(numerator, denominator); numerator /= g; denominator /= g; if (denominator < 0) { numerator = -numerator; denominator = -denominator; } this.numerator = numerator; this.denominator = denominator; } public int getNumerator() { return numerator; } public int getDenominator() { return denominator; } public int compareTo(Fraction other) { // normalize to common denominator before comparing int myCommon = numerator * other.denominator; int otherCommon = other.numerator * denominator; return myCommon - otherCommon; } public boolean equals(Object o) { if (o != null && getClass() == o.getClass()) { Fraction other = (Fraction) o; return numerator == other.numerator && denominator == other.denominator; } else { return false; } } public Fraction add(Fraction other) { int n = numerator * other.denominator + other.numerator * denominator; int d = denominator * other.denominator; return new Fraction(n, d); } public Fraction subtract(Fraction other) { int n = numerator * other.denominator - other.numerator * denominator; int d = denominator * other.denominator; return new Fraction(n, d); } public Fraction multiply(Fraction other) { int n = numerator * other.numerator; int d = denominator * other.denominator; return new Fraction(n, d); } public Fraction divide(Fraction other) { int n = numerator * other.denominator; int d = denominator * other.numerator; return new Fraction(n, d); } public String toString() { if (denominator == 1) { return String.valueOf(numerator); } else { return numerator + "/" + denominator; } } private int gcd(int a, int b) { if (b == 0) { return Math.abs(a); } else { return gcd(b, a % b); } } }