public class Rational {

    private int numerator;
    private int denominator;

    // constructors
    /**
    * Two constructors for two input conditions;
     when there is only one input then default value of denominator is set to be 1;
     Negative rational numbers are set to be negative at numerator;
    */

    public Rational(int numerator) {
	     this.numerator=numerator;
       denominator=1;
    }

    public Rational(int numerator, int denominator) {
      if(denominator<0){
        numerator=-1*numerator;
        denominator=-1*denominator;
      }
      this.numerator=numerator;
      this.denominator=denominator;
      reduce();
    }

    // getters
    /**
    * return the values of numerator and denominator
    */
    public int getNumerator() {
	     return numerator;
    }

    public int getDenominator() {
	     return denominator;
    }

    // instance methods
    /**
    * the mathmetical method of addition of rational numbers;
    */
    public Rational plus(Rational other) {
      int newDenominator = denominator * other.denominator;
	    int newNumerator = numerator * other.denominator;
	    int newOtherNumerator = other.numerator * denominator;
	    int sumNumerator = newNumerator + newOtherNumerator;
	    return new Rational(sumNumerator, newDenominator);
    }

    public static Rational plus(Rational a, Rational b) {
    	return a.plus(b);
    }

    // Transforms this number into its reduced form
    /**
    * if the rational number is 0, then its rational form is '0/1';
    * otherwise,the rational number is reduced to the simplest form;
    */
    private void reduce() {
      if(numerator==0){
        denominator=1;
      }
      else{
        int x=gcd(Math.abs(numerator),denominator);
        numerator=numerator/x;
        denominator=denominator/x;
      }
    }

    // Euclid's algorithm for calculating the greatest common divisor
    private int gcd(int a, int b) {
    	while (a != b)
    	    if (a > b)
    		     a = a - b;
    	    else
    		     b = b - a;
    	return a;
    }
    /**
    * I don't even understand what is the use of this method but i did it;
    */
    public int compareTo(Rational other) {
      int total_numerator1 = numerator * other.numerator;
      int total_numerator2 = denominator * other.denominator;
      return total_numerator1-total_numerator2;
    }
    /**
    * compare the values of target two rational numbers;
    */
    public boolean equals(Rational other) {
      if(numerator==other.numerator&&denominator==other.denominator){
        return true;
      }
      else{
        return false;
      }
    }

    public String toString() {
    	String result;
    	if (denominator == 1) {
    	   result=String.valueOf(numerator);
    	} else {
    	    result=String.valueOf(numerator)+"/"+String.valueOf(denominator);
    	}
    	return result;
    }

}
