File size: 1,995 Bytes
63f6453 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | /** Değişmez (immutable) kesir; her zaman sadeleştirilmiş, payda pozitif. */
public final class Fraction implements Comparable<Fraction> {
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;
}
}
|