
import java.math.BigDecimal;
import java.math.BigInteger;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author LH
 */
public class Rational extends Number
{
    private BigInteger za,ne;
    
    public Rational(int z,int n)
    {
        za=new BigInteger(z+"");
        ne=new BigInteger(n+"");
    }
    public Rational(String z,String n)
    {
        za=new BigInteger(z);
        ne=new BigInteger(n);
    }
    public Rational(BigInteger z, BigInteger n)
    {
        za=z;
        ne=n;
    }
    
    public Rational add(Rational r)
    {
        BigInteger ggt = ne.gcd(r.ne);
        BigInteger gemNenner=ne.multiply(r.ne).divide(ggt);
        BigInteger b1m = gemNenner.divide(ne);
        BigInteger b2m = gemNenner.divide(r.ne);
        BigInteger z = b1m.multiply(za).add(b2m.multiply(r.za));
        BigInteger ktemp = z.gcd(gemNenner);
        return new Rational(z.divide(ktemp),gemNenner.divide(ktemp));
    }
    public Rational subtract(Rational r)
    {
        BigInteger ggt = ne.gcd(r.ne);
        BigInteger gemNenner=ne.multiply(r.ne).divide(ggt);
        BigInteger b1m = gemNenner.divide(ne);
        BigInteger b2m = gemNenner.divide(r.ne);
        BigInteger z = b1m.multiply(za).subtract(b2m.multiply(r.za));
        BigInteger ktemp = z.gcd(gemNenner);
        return new Rational(z.divide(ktemp),gemNenner.divide(ktemp));
    }
    
    public Rational multiply(Rational r)
    {
        BigInteger mz = za.multiply(r.za);
        BigInteger mn = ne.multiply(r.ne);
        BigInteger ktemp = mz.gcd(mn);
        //System.out.println(">>>"+ktemp+"|"+mz.divide(ktemp)+"|"+mn.divide(ktemp));
        return new Rational(mz.divide(ktemp),mn.divide(ktemp));
    }
    @Override
    public String toString()
    {
        return za+(isInteger()?"/"+ne:"")+"";
    }
    
    
    public boolean isInteger()
    {
        return ne.intValue()==1;
    }
    
    
    
    
    //räzel für sie :P
    //   import static java.lang.Integer.*;class A{public static void main(String[] args){Integer a=0,b=a++,e=a++;String c=e.toString(),d=b.toString(),l=((char)parseInt(d+c+c+d+c+c+d+d,a)+c).substring(0, e);String H = l+((char)parseInt(d+c+d+d+c+d+d+d,a))+((char)parseInt(d+c+c+d+d+c+d+c,a))+l+l+(char)parseInt(d+c+c+d+c+c+c+c,a)+(char)parseInt(d+d+c+d+d+d+d+d,a)+(char)parseInt(d+c+d+c+d+c+c+c,a)+(char)parseInt(d+c+c+d+c+c+c+c,a)+(char)parseInt(d+c+c+c+d+d+c+d,a)+l+(char)parseInt(d+c+c+d+d+c+d+d,a)+(char)parseInt(d+d+c+d+d+d+d+c,a);System.out.println(H.substring(e));}}
    //   //was würde dieser codeschnipsel machen?
    //   //und welche tricks benutz ich da (ps: das war im kurs schon dran :P)
    //ende räzel
    
    
    
    
    
    //implementskram
    @Override
    public int intValue()
    {
         return za.divide(ne).intValue();
    }

    @Override
    public long longValue()
    {
        return za.divide(ne).longValue();
    }

    @Override
    public float floatValue()
    {
        BigDecimal za2=new BigDecimal(za);
        BigDecimal ne2=new BigDecimal(ne);
        return za2.divide(ne2).floatValue();
    }

    @Override
    public double doubleValue()
    {
        BigDecimal za2=new BigDecimal(za);
        BigDecimal ne2=new BigDecimal(ne);
        return za2.divide(ne2).doubleValue();  
    }
    
}
