This is exercise 3.2.7. from the book Computer Science An Interdisciplinary Approach by Sedgewick & Wayne:
Implement a data type for rational numbers that supports addition, subtraction, multiplication, and division.
Here is my program:
public class Rational
{
private final int numerator;
private final int denominator;
public Rational(int numerator, int denominator)
{
this.numerator = numerator;
this.denominator = denominator;
}
public int getNumerator()
{
return numerator;
}
public int getDenominator()
{
return denominator;
}
public Rational swapSigns()
{
if (numerator > 0 && denominator < 0)
{
return new Rational(-1*numerator,-1*denominator);
}
else if (numerator < 0 && denominator < 0)
{
return new Rational(-1*numerator,-1*denominator);
}
else
{
return new Rational(numerator,denominator);
}
}
public Rational inverse()
{
return new Rational(denominator,numerator);
}
public Rational simplify()
{
int gcd = Number.calculateGCDRecursively(Math.abs(numerator),denominator);
return new Rational(numerator/gcd,denominator/gcd);
}
public Rational add(Rational otherRational)
{
otherRational = otherRational.swapSigns();
int otherNumerator = otherRational.getNumerator();
int otherDenominator = otherRational.getDenominator();
int newDenominator = denominator*otherDenominator;
int newNumerator = numerator*otherDenominator+denominator*otherNumerator;
return new Rational(newNumerator,newDenominator).simplify();
}
public Rational subtract(Rational otherRational)
{
Rational oldRational = new Rational(numerator, denominator);
int newNumerator = -1*otherRational.getNumerator();
Rational newRational = new Rational(newNumerator,otherRational.getDenominator());
return oldRational.add(newRational);
}
public Rational multipply(Rational otherRational)
{
otherRational = otherRational.swapSigns();
int otherNumerator = otherRational.getNumerator();
int otherDenominator = otherRational.getDenominator();
int newNumerator = numerator*otherNumerator;
int newDenominator = denominator*otherDenominator;
return new Rational(newNumerator,newDenominator).simplify();
}
public Rational divide(Rational otherRational)
{
Rational oldRational = new Rational(numerator, denominator);
Rational newRational = otherRational.inverse();
return oldRational.multipply(newRational);
}
public String toString()
{
Rational oldRational = new Rational(numerator, denominator);
oldRational = oldRational.swapSigns();
return oldRational.getNumerator() + "/" + oldRational.getDenominator();
}
public static void main(String[] args)
{
int numerator1 = Integer.parseInt(args[0]);
int denominator1 = Integer.parseInt(args[1]);
int numerator2 = Integer.parseInt(args[2]);
int denominator2 = Integer.parseInt(args[3]);
Rational rational1 = new Rational(numerator1,denominator1);
Rational rational2 = new Rational(numerator2,denominator2);
System.out.println(rational1.toString() + " plus " + rational2.toString() + " is equal to " + rational1.add(rational2).toString());
System.out.println(rational1.toString() + " minus " + rational2.toString() + " is equal to " + rational1.subtract(rational2).toString());
System.out.println(rational1.toString() + " times " + rational2.toString() + " is equal to " + rational1.multipply(rational2).toString());
System.out.println(rational1.toString() + " divided by " + rational2.toString() + " is equal to " + rational1.divide(rational2).toString());
}
}
Also I wrote the method calculateGCDRecursively
as follows:
public static int calculateGCDRecursively(int p, int q)
{
if (q == 0) return p;
return calculateGCDRecursively(q, p % q);
}
I checked my program and it works correctly. Here are 4 different instances of it:
Input: 3 4 4 5
Output:
3/4 plus 4/5 is equal to 31/20
3/4 minus 4/5 is equal to -1/20
3/4 times 4/5 is equal to 3/5
3/4 divided by 4/5 is equal to 15/16
Input: 3 4 -4 5
Output:
3/4 plus -4/5 is equal to -1/20
3/4 minus -4/5 is equal to 31/20
3/4 times -4/5 is equal to -3/5
3/4 divided by -4/5 is equal to -15/16
Input: 3 4 4 -5
Output:
3/4 plus -4/5 is equal to -1/20
3/4 minus -4/5 is equal to 31/20
3/4 times -4/5 is equal to -3/5
3/4 divided by -4/5 is equal to -15/16
Input: 3 4 -4 -5
Output:
3/4 plus 4/5 is equal to 31/20
3/4 minus 4/5 is equal to -1/20
3/4 times 4/5 is equal to 3/5
3/4 divided by 4/5 is equal to 15/16
Is there any way that I can improve my program?
Thanks for your attention.