package sk.upjs.umv;
import java.util.List;
public class Zlomok {
        private int citatel;
        private int menovatel;
        public static final Zlomok POLOVICA = new Zlomok(1, 2);
        public Zlomok(int citatel, int menovatel) {
                this.citatel = citatel;
                if (menovatel != 0) {
                        if (menovatel < 0) {
                                this.menovatel = Math.abs(menovatel);
                                this.citatel = (-1) * citatel;
                        } else
                                this.menovatel = menovatel;
                } else
                        throw new RuntimeException();
        }
        public int getCitatel() {
                return citatel;
        }
        public int getMenovatel() {
                return menovatel;
        }
        @Override
        public String toString() {
                return citatel + "/" + menovatel;
        }
        @Override
        public boolean equals(Object obj) {
                if (obj == null)
                        return false;
                if (obj == this)
                        return true;
                if (!(obj instanceof Zlomok))
                        return false;
                Zlomok zlomok2 = (Zlomok) obj;
                return (this.citatel * zlomok2.menovatel == zlomok2.citatel
                                * this.menovatel);
        }
        @Override
        public int hashCode() {
                return 0;
        }
        public Zlomok pripocitaj(Zlomok z) {
                return new Zlomok(this.citatel * z.menovatel + z.citatel
                                * this.menovatel, this.menovatel * z.menovatel);
        }
        public static Zlomok sucet(List<Zlomok> zlomky) {
                Zlomok sucet = new Zlomok(0, 1);
                for (Zlomok z : zlomky)
                        sucet = sucet.pripocitaj(z);
                sucet = Zlomok.naZakladnyTvar(sucet);
                return sucet;
        }
        public static Zlomok naZakladnyTvar(Zlomok z) {
                int citatel = z.citatel;
                z.citatel = z.citatel / z.NSD(z.citatel, z.menovatel);
                z.menovatel = z.menovatel / z.NSD(citatel, z.menovatel);
                return z;
        }
        /**
         * vráti najväčšieho spoločného deliteľa čísel a a b
         */
        public static int NSD(int a, int b) {
                a = Math.abs(a);
                b = Math.abs(b);
                // budeme hladat euklidovym algoritmom a nastavime cisla tak aby A bolo
                // vecsie ako B ak nie je
                if (a < b) {
                        a = a + b;
                        b = a - b;
                        a = a - b;
                }
                // opatrenie proti nepriatelom
                if (b == 0) {
                        return a;
                }
                // budeme potrebovat pomocnu premennu, lebo na konci cyklu budeme
                // ukladat aj do acka aj do becka nejaky vyraz pricom ked najprv ulozim
                // do acka vyraz, tak potom do becka bez pomocnej premennej budem mat
                // problem ulozit spravnu hodnotu lebo sme zmenili uz acko
                int pomCislo = 1;
                while (b != 0) {
                        /*
                         * strategia: mame dve cisla, vecsie cislo z nich si rozpiseme na
                         * (kolkokrat sa celociselne nachadza mensie cislo vo vecsom) *
                         * (mensie cislo) + (zvysok po deleni velkeho a maleho) toto budeme
                         * opakovat dovtedy, dokym (zvysok po deleni velkeho a maleho) != 0
                         * po kazdej iteracii cyklu budeme mat nove cislo 'a' a nove cislo
                         * 'b' cislo 'a'=((a) - (zvysok po deleni a/druhe cislo)) / (a /
                         * druhe cislo) cislo 'b'=(a % b)
                         */
                        pomCislo = a % b;
                        a = (a - a % b) / (a / b);
                        b = pomCislo;
                }
                return a;
        }
}