-
Notifications
You must be signed in to change notification settings - Fork 0
/
Fraction.java
145 lines (126 loc) · 3.95 KB
/
Fraction.java
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Author: Joshua Abbott
// Date: 01/25/2019
// Additional files: FractionCalculator.java
public class Fraction
{
// Variables:
private int numerator;
private int denominator;
// Constructors:
public Fraction(int numerator)
{
this.numerator = numerator;
denominator = 1;
}
public Fraction(int numerator, int denominator)
{
// Reduce the fraction to lowest terms:
int divisor = gcd(numerator, denominator);
this.numerator = numerator / divisor;
this.denominator = denominator / divisor;
}
// Methods:
public Fraction add(Fraction right)
{
int den1 = this.denominator;
int den2 = right.denominator;
if(gcd(den1, den2) == 1)
{
this.numerator *= den2;
this.denominator *= den2;
right.numerator *= den1;
right.denominator *= den1;
}
else if (den1 == den2){ /* Do nothing */ }
else if (den1 > den2)
{
int scalar = den1 / den2;
right.numerator *= scalar;
right.denominator *= scalar;
}
else
{
int scalar = den2 / den1;
this.numerator *= scalar;
this.denominator *= scalar;
}
// Finally add the fractions:
this.numerator += right.numerator;
return this.reduce();
}
public Fraction sub(Fraction right)
{
int den1 = this.denominator;
int den2 = right.denominator;
if(gcd(den1, den2) == 1)
{
this.numerator *= den2;
this.denominator *= den2;
right.numerator *= den1;
right.denominator *= den1;
}
else if (den1 == den2){ /* Do nothing */ }
else if (den1 > den2)
{
int scalar = den1 / den2;
right.numerator *= scalar;
right.denominator *= scalar;
}
else
{
int scalar = den2 / den1;
this.numerator *= scalar;
this.denominator *= scalar;
}
// Finally subtract the fractions:
this.numerator -= right.numerator;
return this.reduce();
}
public Fraction mult(Fraction right)
{
this.numerator *= right.numerator;
this.denominator *= right.denominator;
return this.reduce();
}
public Fraction div(Fraction right)
{
this.numerator *= right.denominator;
this.denominator *= right.numerator;
return this.reduce();
}
public Fraction reduce()
{
int divisor = gcd(numerator, denominator);
this.numerator = numerator / divisor;
this.denominator = denominator / divisor;
return this;
}
public String toString() { return this.numerator + "/" + this.denominator; }
public boolean equals(Object other)
{
if (this == other) return true; // Test objects for equality
if (other == null) return false; // Test for null
if (getClass() != other.getClass()) // Test classes for equality
return false;
if(!(other instanceof Fraction)) return false; // Use instance of test
var otherObject = (Fraction) other; // Cast variable to same class type
return numerator == otherObject.numerator // Return if fields match
&& denominator == otherObject.denominator;
}
private int gcd(int u, int v) // Euclid's Algorithm
{
u = (u < 0) ? -u : u; // Ensure that u is not negative
v = (v < 0) ? -v : v; // Ensure that v is not negative
while (u > 0)
{
if (u < v)
{
int temp = u;
u = v;
v = temp;
}
u -= v;
}
return v; // v holds the GCD of u and v
}
}