Lab 2: Big Fractions
Bard College – Computer Science – Data Structures

In this lab, we will create a new user-defined type for doing arithmetic on Rational numbers, or put in other terms: adding, subtracting, multiplying, and dividing fractions. 

407409+409419+419421+421431=12261837304431095439321\frac{407}{409} + \frac{409}{419} + \frac{419}{421} + \frac{421}{431} = \frac{122618373044}{31095439321}

Rather than using int or  long as our underlying primitive data type, we'll use BigInteger which is a little cumbersome, but allows exact arithmetic (i.e. no overflows).

jshell> 123456 * 123456
-1938485248

jshell> BigInteger.valueOf(123456).multiply(BigInteger.valueOf(123456))
1524138393

After all what good is a Fraction class that cannot add four simple fractions.

Fraction f1 = new Fraction(407, 409);
Fraction f2 = new Fraction(409, 419);
Fraction f3 = new Fraction(419, 421);
Fraction f4 = new Fraction(421, 431);
System.out.println(f1.add(f2).add(f3).add(f4));
645226180/-343556083

This is clearly a wrong answer. But BigInteger to the rescue.

System.out.println(f1.add(f2).add(f3).add(f4));
122618373044/31095439321

A Rational Datatype: Fraction

First, let's introduce the Fraction interface (that you should not change):

public class Fraction extends Number
    Fraction (BigInteger n, BigInteger d) throws IllegalArgumentException
    // creates a new fraction with the numerator n and denominator d
    // throw an exception if the denominator is zero

    Fraction (BigInteger n
    // creates a new fraction with the numerator n and denominator 1

    Fraction (int n, int d)   throws IllegalArgumentException
    // creates a new fraction with the numerator n and denominator d
    // throw an exception if the denominator is zero

    Fraction (int n)
    // creates a new fraction with the numerator n and denominator 1

    BigInteger getNumerator()
    // returns the numerator