import eprog.EprogException; import java.lang.Number; class Bruch extends Number { public Bruch() throws EprogException { zaehler = 0; nenner = 1; } public Bruch(int Zaehler) throws EprogException { zaehler = Zaehler; nenner = 1; } public Bruch(int Zaehler, int Nenner) throws EprogException { if(Nenner == 0) throw new EprogException(); zaehler = Zaehler; nenner = Nenner; } public float floatValue() { return (float)doubleValue(); } public double doubleValue() { return (double)zaehler / (double)nenner; } public long longValue() { return Math.round(doubleValue()); } public int intValue() { return (int)longValue(); } public byte byteValue() { return (byte)longValue(); } public String toString() { if(nenner == 0) return "(infinite)"; if(zaehler == 0) return "0"; return zaehler + "/" + nenner; } public Bruch add(Bruch summand) throws EprogException { return new Bruch(zaehler * summand.nenner + summand.zaehler * nenner, nenner * summand.nenner).kuerzen(); } public Bruch subtract(Bruch subtraktor) throws EprogException { return add(new Bruch(-subtraktor.zaehler, subtraktor.nenner)); } public Bruch multiply(Bruch faktor) throws EprogException { return new Bruch(zaehler * faktor.zaehler, nenner * faktor.nenner).kuerzen(); } public Bruch divide(Bruch divisor) throws EprogException { return multiply(divisor.invert()); } public Bruch invert() throws EprogException { return new Bruch(nenner, zaehler).kuerzen(); } public Bruch negate() throws EprogException { return new Bruch(-zaehler, nenner); } public Bruch kuerzen() throws EprogException { if(nenner == 0) throw new EprogException(); if(zaehler == 0) { nenner = 1; return this; } long ggT = Math.min(Math.abs(zaehler), Math.abs(nenner)); while (zaehler / ggT != (double)zaehler / ggT || nenner / ggT != (double)nenner / ggT) { ggT = ggT - 1; } if(nenner < 0) ggT = -ggT; zaehler /= ggT; nenner /= ggT; return this; } public boolean equals(int valInt) throws EprogException { if(nenner * valInt != zaehler) return false; return true; } int zaehler; int nenner; }