package sk.upjs.umv;
import java.util.List;
public class Zlomok implements Comparable<Zlomok> {
public static final Zlomok JENDA_POLOVICA = new Zlomok(1, 2);
private long citatel;
private long menovatel;
public Zlomok(long citatel, long menovatel) {
this.citatel = citatel;
this.menovatel = menovatel;
normalizuj();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (citatel ^ (citatel >>> 32));
result = prime * result + (int) (menovatel ^ (menovatel >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Zlomok other = (Zlomok) obj;
if (citatel != other.citatel)
return false;
if (menovatel != other.menovatel)
return false;
return true;
}
public static Zlomok sucet(List<Zlomok> zlomky) {
Zlomok vysledok = new Zlomok(1, 1);
for (Zlomok z : zlomky) {
long spolocnyMenovatel = vysledok.menovatel * z.menovatel;
long citatel = vysledok.citatel * z.menovatel + z.citatel * vysledok.menovatel;
vysledok.citatel = citatel;
vysledok.menovatel = spolocnyMenovatel;
vysledok.normalizuj();
}
// odcitam jednotku, ktoru som mal na zaciatku
vysledok.citatel -= vysledok.menovatel;
vysledok.normalizuj();
return vysledok;
}
public long getCitatel() {
return citatel;
}
public long getMenovatel() {
return menovatel;
}
private void normalizuj() {
long gcd = gcd(citatel, menovatel);
if (gcd == 0)
gcd = 1;
citatel /= gcd;
menovatel /= gcd;
}
private long gcd(long a, long b) {
if (a == 0)
return b;
while (b != 0)
if (a > b)
a = a - b;
else
b = b - a;
return a;
}
@Override
public String toString() {
return citatel + "/" + menovatel;
}
@Override
public int compareTo(Zlomok z) {
return Long.compare(citatel * z.menovatel, z.citatel * menovatel);
}
}