/**
 * Beschreiben Sie hier die Klasse Bruch.
 * 
 * @author chattpg
 * @version 1.0
 */
public class Bruch {
    private int zaehler;
    private int nenner;

    public Bruch(int zaehler, int nenner) {
        if (nenner == 0) {
            throw new IllegalArgumentException("Der Nenner darf nicht 0 sein.");
        }

        int gcd = greatestCommonDivisor(Math.abs(zaehler), Math.abs(nenner));
        int sign = (zaehler < 0) ^ (nenner < 0) ? -1 : 1; // XOR to determine the sign
        this.zaehler = sign * Math.abs(zaehler) / gcd;
        this.nenner = Math.abs(nenner) / gcd;
    }

    public Bruch(int wert) {
        this(wert, 1);
    }

    public Bruch addieren(Bruch b) {
        int neuerZaehler = this.zaehler * b.nenner + b.zaehler * this.nenner;
        int neuerNenner = this.nenner * b.nenner;
        return new Bruch(neuerZaehler, neuerNenner);
    }

    public Bruch subtrahieren(Bruch b) {
        int neuerZaehler = this.zaehler * b.nenner - b.zaehler * this.nenner;
        int neuerNenner = this.nenner * b.nenner;
        return new Bruch(neuerZaehler, neuerNenner);
    }

    public Bruch multiplizieren(Bruch b) {
        int neuerZaehler = this.zaehler * b.zaehler;
        int neuerNenner = this.nenner * b.nenner;
        return new Bruch(neuerZaehler, neuerNenner);
    }

    public Bruch dividieren(Bruch b) {
        if (b.zaehler == 0) {
            throw new ArithmeticException("Division durch Null ist nicht erlaubt.");
        }
        int neuerZaehler = this.zaehler * b.nenner;
        int neuerNenner = this.nenner * b.zaehler;
        return new Bruch(neuerZaehler, neuerNenner);
    }

    public int getZaehler() {
        return zaehler;
    }

    public int getNenner() {
        return nenner;
    }

    // Hilfsmethode zur Berechnung des gr��ten gemeinsamen Teilers
    private int greatestCommonDivisor(int a, int b) {
        if (b == 0) {
            return a;
        } else {
            return greatestCommonDivisor(b, a % b);
        }
    }
}


