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