Title: Clase Fraccion
Course: 2025 - LISI - Programacion Orientada a Objetos 1-3

public class Fraccion {

    private int numerador;

    private int denominador;

    public Fraccion() {
        this(0, 1);
    }

    public Fraccion(int numero) {
        this(numero, 1);
    }

    public Fraccion(Fraccion frac) {
        this(frac.getNumerador(), frac.getDenominador());
    }

    public Fraccion(int num, int denom) {

        if (denom < 0) {
            num = -num;
            denom = -denom;
        }

        if (num == 0) {
            denom = 1;
        }

        setNumerador(num);
        setDenominador(denom);
    }

    public static int mcm(int numero1, int numero2) {
        if (numero1 == 0 || numero2 == 0)
            return 0;

        return Math.abs(numero1 * numero2) / mcd(numero1, numero2);
    }

    public static int mcd(int m, int n) {
        int r = n % m;
        while (r != 0) {
            n = m;
            m = r;
            r = n % m;
        }
        return m;
    }

    public static Fraccion menor(Fraccion f1, Fraccion f2) {

        double f1_dec = f1.numero();
        double f2_dec = f2.numero();

        if (f1_dec <= f2_dec) {

            return f1;

        } else {

            return f2;
        }
    }

    public Fraccion suma(Fraccion frac) {
        int a, b, c, d;

        Fraccion suma;

        a = this.getNumerador();
        b = this.getDenominador();
        c = frac.getNumerador();
        d = frac.getDenominador();

        suma = new Fraccion(a * d + b * c, b * d);

        return suma;
    }

    public Fraccion suma(int number) {

        Fraccion frac = new Fraccion(number, 1);

        Fraccion suma = suma(frac);

        return suma;
    }

    public Fraccion dividir(Fraccion frac) {
        int a, b, c, d;

        Fraccion cociente;

        a = this.getNumerador();
        b = this.getDenominador();
        c = frac.getNumerador();
        d = frac.getDenominador();

        cociente = new Fraccion(a * d, b * c);

        return cociente;
    }

    public Fraccion dividir(int number) {

        Fraccion frac = new Fraccion(number, 1);

        Fraccion cociente = dividir(frac);

        return cociente;
    }

    public boolean equals(Fraccion frac) {

        Fraccion f1 = simplificar(); // simplificar
        Fraccion f2 = frac.simplificar(); // simplificar

        return (f1.getNumerador() == f2.getNumerador() &&
                f1.getDenominador() == f2.getDenominador());
    }

    public int getDenominador() {
        return denominador;
    }

    public int getNumerador() {
        return numerador;
    }

    public Fraccion multiplicar(Fraccion frac) {
        int a, b, c, d;

        Fraccion producto;

        a = this.getNumerador();
        b = this.getDenominador();
        c = frac.getNumerador();
        d = frac.getDenominador();

        producto = new Fraccion(a * c, b * d);

        return producto;
    }

    public Fraccion multiplicar(int numero) {

        Fraccion fraccion = new Fraccion(numero, 1);

        Fraccion producto = multiplicar(fraccion);

        return producto;
    }

    public void setDenominador(int denom) {
        if (denom == 0) {
            // Fatal error
            System.out.println("Fatal Error");
            System.exit(1);
        }
        denominador = denom;
    }

    public void setNumerador(int num) {
        numerador = num;
    }

    public Fraccion simplificar() {

        int num = getNumerador();
        int denom = getDenominador();

        int divisor = 1;

        if (num != 0) {
            divisor = mcd(Math.abs(num), denom);
        }

        return new Fraccion(num / divisor, denom / divisor);
    }

    public Fraccion restar(Fraccion frac) {
        int a, b, c, d;

        Fraccion diferencia;

        a = this.getNumerador();
        b = this.getDenominador();
        c = frac.getNumerador();
        d = frac.getDenominador();

        diferencia = new Fraccion(a * d - b * c, b * d);

        return diferencia;
    }

    public Fraccion restar(int numero) {

        Fraccion fraccion = new Fraccion(numero, 1);

        Fraccion diferencia = restar(fraccion);

        return diferencia;
    }

    public String toString() {

        return getNumerador() + "/" + getDenominador();
    }

    private double numero() {
        return (double) getNumerador() / getDenominador();
    }

}