forked from AllenDowney/ThinkJavaCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRational.java
More file actions
162 lines (137 loc) · 3.1 KB
/
Copy pathRational.java
File metadata and controls
162 lines (137 loc) · 3.1 KB
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/**
* Represents a rational number as a ratio of two integers.
*/
public class Rational {
private int numerator;
private int denominator;
/**
* Construct a Rational object with default values.
*/
public Rational() {
this.numerator = 0;
this.denominator = 1;
}
/**
* Construct a Rational object with given values.
*/
public Rational(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
if (this.denominator < 0) {
this.numerator *= -1;
this.denominator *= -1;
}
if (this.numerator < 0 &&
this.denominator < 0) {
this.numerator *= -1;
this.denominator *= -1;
}
}
/**
* Return a String representation of the rational number.
*/
public String toString() {
return String.format("%d/%d",
numerator, denominator);
}
public int getNumerator() {
return this.numerator;
}
public int getDenominator() {
return this.denominator;
}
public void setNumerator(int numerator) {
this.numerator = numerator;
}
public void setDenominator(int denominator) {
this.denominator = denominator;
}
/**
* Tests whether two rationals are equivalent.
*/
public boolean equals(Rational that) {
return this.numerator == that.numerator
&& this.denominator == that.denominator;
}
/**
* Prints formatted rational
*/
public void printRational() {
System.out.printf("%d/%d\n",
this.numerator, this.denominator);
}
/**
* Negates the rational
*/
public void negate() {
this.numerator *= -1;
}
/**
* Inverts the rational so that the numerator
* and the denominator values are swapped.
*/
public void invert() {
int temp = this.numerator;
this.numerator = this.denominator;
this.denominator = temp;
if (this.denominator < 0) {
this.numerator *= -1;
this.denominator *= -1;
}
}
/**
* Returns the rational converted to a double.
*/
public double toDouble() {
return (float) this.numerator
/ this.denominator;
}
/**
* Reduces rational to its lowest terms and returns the result.
*/
public Rational reduce() {
Rational res = new Rational();
int a;
int b;
int temp;
if (this.numerator < this.denominator) {
a = this.numerator;
b = this.denominator;
}
else {
a = this.denominator;
b = this.numerator;
}
// using the Euclidean algorithm
while (b % a != 0) {
temp = a;
a = b % a;
b = temp;
}
res.numerator = this.numerator/a;
res.denominator = this.denominator/a;
return res;
}
/**
* Returns the sum of two rationals.
*/
public Rational add(Rational that) {
// multiplys fractions to have common denominator.
int n1 = this.numerator * that.denominator;
int n2 = that.numerator * this.denominator;
int d = this.denominator * that.denominator; // same denominator for both fractions
Rational sum = new Rational (n1 + n2, d);
//reduces for nice result.
return sum.reduce();
}
public static void main(String[] args) {
Rational rat = new Rational();
Rational mouse = new Rational(3, -9);
rat.setNumerator(5);
rat.setDenominator(16);
rat.printRational();
System.out.println(mouse);
mouse.toDouble();
System.out.println(mouse.add(rat));
}
}