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;
}
}