class xRational

    // Identical to Rational except for the exception "Denominator is 0"
{  private long numer, denom;

    xRational (long n, long d) throws Exception
    { long pn = Math.abs(n);
      long pd = Math.abs(d);
	if (pd == 0) throw new Exception ("Denominator is 0");
	long sign = (n == 0)? 0:(n/pn)*(d/pd);
	long g  = gcd (pn, pd);
	numer = sign * (pn/g); denom = pd/g;
    }

   xRational () throws Exception
    { this (0, 1);
    }

   private long gcd (long n, long d)
    { long pn = Math.abs(n); 
      long pd = Math.abs (d);
	long rem = pn % pd;
	while (rem != 0)
	    { pn = pd; pd = rem; rem = pn %pd;
	    }
	return pd;
    }

   public String show ()
    { return numer + "/" + denom; }

   public xRational add (xRational r) throws Exception
    {  long n = numer*r.denom + denom*r.numer;
       long d = denom*r.denom;
	 return new xRational (n, d);
    }

   public xRational sub (xRational r) throws Exception
    {  long n = numer*r.denom - denom*r.numer;
       long d = denom*r.denom;
	 return new xRational (n, d);
    }

   public xRational mult (xRational r) throws Exception
    {  long n = numer*r.numer;
       long d = denom*r.denom;
	 return new xRational (n, d);
    }

   public xRational div (xRational r) throws Exception

    {  if (r.numer == 0) throw new Exception ("Division by xRational 0/1");
	 long n = numer*r.denom;
       long d = denom*r.numer;
	 return new xRational (n, d);
    }

   public boolean equal (xRational r) 
    {  return ((numer == r.numer) && (denom == r.denom));}

   public boolean lessthan (xRational r)
    {  return (numer*r.denom < r.numer*denom); }

   public boolean lteq (xRational r)
    { return (lessthan (r) || equal (r)); }

}
