/** Değişmez (immutable) kesir; her zaman sadeleştirilmiş, payda pozitif. */ public final class Fraction implements Comparable { private final long num; private final long den; public Fraction(long num, long den) { if (den == 0) { throw new ArithmeticException("denominator is zero"); } if (den < 0) { num = -num; den = -den; } long g = gcd(Math.abs(num), den); this.num = num / g; this.den = den / g; } static long gcd(long a, long b) { while (b != 0) { long t = a % b; a = b; b = t; } return a == 0 ? 1 : a; } public long numerator() { return num; } public long denominator() { return den; } public Fraction add(Fraction o) { return new Fraction(num * o.den + o.num * den, den * o.den); } public Fraction subtract(Fraction o) { return new Fraction(num * o.den - o.num * den, den * o.den); } public Fraction multiply(Fraction o) { return new Fraction(num * o.num, den * o.den); } public Fraction divide(Fraction o) { if (o.num == 0) { throw new ArithmeticException("division by zero"); } return new Fraction(num * o.den, den * o.num); } public double toDouble() { return (double) num / den; } @Override public int compareTo(Fraction o) { return Long.compare(num * o.den, o.num * den); } @Override public boolean equals(Object other) { if (this == other) return true; if (!(other instanceof Fraction)) return false; Fraction f = (Fraction) other; return num == f.num && den == f.den; } @Override public int hashCode() { return Long.hashCode(num) * 31 + Long.hashCode(den); } @Override public String toString() { return den == 1 ? Long.toString(num) : num + "/" + den; } }