So I'm writing an assignment for my OOP class that asks the user for a number of fractions, then randomly generates that number of fractions. Part of the assignment states that if one of the fractions cannot be simplified then skip it and create a new fraction that can be simplified. However the unreducible fractions still make it through. I need a way to have the program make a new fraction if the GCD of a fraction is 1.
Code:
import java.util.Random;
// The class is called boxes because I'm supposed to print boxes around the fractions, but I'll
implement it later.
class SimpleFracBoxes{
private int numberOfFractions = 0;
private String result = "";
Random myRandom = new Random( );
int min = 1;
int max = 100000;
public SimpleFracBoxes( )
{
}
public SimpleFracBoxes(int nOFracs)
{
numberOfFractions = nOFracs;
}
// makes the fractions
public void makeTheFractions()
{
for (int i = 0; i < numberOfFractions; i++)
{
Fraction frac = getAGoodFraction();
Fraction frac2 = frac.simplify();
result = result + " "+ (int)(i + 1) + ": " + frac + " simplifies to "+ frac2 + "\n" ;
}
}
// creates a fraction that can be divided
private Fraction getAGoodFraction()
{
Fraction frac;
do {
frac = new Fraction (myRandom.nextInt(max-min), myRandom.nextInt(max-min));
}
while (frac.getNumerator() >= frac.getDenominator());
int num = frac.getNumerator();
int denom = frac.getDenominator();
int gcd = frac.gcd(num, denom);
if (gcd == 1) {
getAGoodFraction();
} else if (gcd !=1) {
frac.simplify();
}
return frac;
}
public String getFractions()
{
return result;
}
}
Fraction Class code
public class Fraction{
private int numerator;
private int denominator;
public Fraction(){
this(0,1);
}
public Fraction(int number) {
this(number,1);
}
public Fraction(Fraction frac) {
this(frac.getNumerator(), frac.getDenominator());
}
public Fraction(int num, int denom){
setNumerator(num);
setDenominator(denom);
}
public static int gcd(int m, int n) {
int r = n % m;
while (r != 0) {
n = m;
m = r;
r = n % m;
}
return m;
}
public static Fraction min(Fraction f1, Fraction f2) {
double f1_dec = f1.decimal();
double f2_dec = f2.decimal();
if (f1_dec <= f2_dec) {
return f1;
} else {
return f2;
}
}
public Fraction add(Fraction frac) {
int a, b, c, d;
Fraction sum;
a = this.getNumerator();
b = this.getDenominator();
c = frac.getNumerator();
d = frac.getDenominator();
sum = new Fraction(a*d + b*c, b*d);
return sum;
}
public Fraction add(int number) {
Fraction frac = new Fraction(number, 1);
Fraction sum = add(frac);
return sum;
}
public Fraction divide(Fraction frac) {
int a, b, c, d;
Fraction quotient;
a = this.getNumerator();
b = this.getDenominator();
c = frac.getNumerator();
d = frac.getDenominator();
quotient = new Fraction(a*d, b*c);
return quotient;
}
public Fraction divide(int number) {
Fraction frac = new Fraction(number, 1);
Fraction quotient = divide(frac);
return quotient;
}
public boolean equals(Fraction frac) {
Fraction f1 = simplify();
Fraction f2 = frac.simplify();
if (f1.getNumerator() == f2.getNumerator() &&
f1.getDenominator() == f2.getDenominator()) {
return true;
} else {
return false;
}
}
public int getDenominator() {
return denominator;
}
public int getNumerator(){
return numerator;
}
public Fraction multiply(Fraction frac){
int a, b, c, d;
Fraction product;
a = this.getNumerator();
b = this.getDenominator();
c = frac.getNumerator();
d = frac.getDenominator();
product = new Fraction(a*c, b*d);
return product;
}
public Fraction multiply(int number){
Fraction frac = new Fraction(number, 1);
Fraction product = multiply(frac);
return product;
}
public void setDenominator(int denom){
if (denom == 0) {
System.err.println("Fatal Error");
System.exit(1);
}
denominator = denom;
}
public void setNumerator(int num) {
numerator = num;
}
public Fraction simplify(){
int num = getNumerator();
int denom = getDenominator();
int gcd = gcd(num, denom);
Fraction simp = new Fraction(num/gcd, denom/gcd);
return simp;
}
public Fraction subtract(Fraction frac) {
int a, b, c, d;
Fraction diff;
a = this.getNumerator();
b = this.getDenominator();
c = frac.getNumerator();
d = frac.getDenominator();
diff = new Fraction(a*d - b*c, b*d);
return diff;
}
public Fraction subtract(int number) {
Fraction frac = new Fraction(number, 1);
Fraction difference = subtract(frac);
return difference;
}
public String toString() {
return getNumerator() + "/" + getDenominator();
}
private double decimal() {
return (double) getNumerator() / getDenominator();
}
}
Output:
How many fractions? 3
1: 28181/38503 simplifies to 28181/38503 // Unsimplified
2: 75654/99570 simplifies to 12609/16595
3: 787/31255 simplifies to 787/31255 // Unsimplified
decimal()
in class Fraction
is not used, so I removed it.getAGoodFraction()
when the GCD value is 1, use a loop.Fraction
object each time the randomly generated numerator is greater than the randomly generated denominator, use methods setNumerator()
and setDenominator()
. That's what they're for.simplify()
in method getAGoodFraction()
. Just return the fraction. Because the GCD is not equal to 1, you know it can be simplified.Compare the following code with yours.
Note that I added a main()
method to class Fraction
so as to be able to run the code. And I also changed method gcd()
due to the comment to your question from @KevinAnderson.
import java.util.Random;
public class Fraction {
private int numerator;
private int denominator;
public Fraction() {
this(0, 1);
}
public Fraction(int number) {
this(number, 1);
}
public Fraction(Fraction frac) {
this(frac.getNumerator(), frac.getDenominator());
}
public Fraction(int num, int denom) {
setNumerator(num);
setDenominator(denom);
}
public static int gcd(int m, int n) {
int factor = m;
int r = n % factor;
while (r != 0 && factor > 1) {
r = n % --factor;
if (r == 0) {
r = m % factor;
}
}
return factor;
}
public int getDenominator() {
return denominator;
}
public int getNumerator() {
return numerator;
}
public void setDenominator(int denom) {
if (denom == 0) {
System.err.println("Fatal Error");
System.exit(1);
}
denominator = denom;
}
public void setNumerator(int num) {
numerator = num;
}
public Fraction simplify() {
int num = getNumerator();
int denom = getDenominator();
int gcd = gcd(num, denom);
Fraction simp = new Fraction(num / gcd, denom / gcd);
return simp;
}
public String toString() {
return getNumerator() + "/" + getDenominator();
}
public static void main(String[] args) {
SimpleFracBoxes sfb = new SimpleFracBoxes(10);
sfb.makeTheFractions();
System.out.println(sfb.getFractions());
}
}
class SimpleFracBoxes {
private int numberOfFractions = 0;
private String result = "";
Random myRandom = new Random();
int min = 1;
int max = 100000;
public SimpleFracBoxes() {
}
public SimpleFracBoxes(int nOFracs) {
numberOfFractions = nOFracs;
}
//makes the fractions
public void makeTheFractions() {
for (int i = 0; i < numberOfFractions; i++) {
Fraction frac = getAGoodFraction();
Fraction frac2 = frac.simplify();
result += String.format("%" + String.valueOf(numberOfFractions).length() + "d. %5d/%5d simplifies to %5d/%5d%n",
(i + 1),
frac.getNumerator(),
frac.getDenominator(),
frac2.getNumerator(),
frac2.getDenominator());
}
}
// creates a fraction that can be divided
private Fraction getAGoodFraction() {
int gcd = 1;
Fraction frac = new Fraction();
while (gcd == 1) {
do {
frac.setNumerator(myRandom.nextInt(max - min));
frac.setDenominator(myRandom.nextInt(max - min));
} while (frac.getNumerator() >= frac.getDenominator());
int num = frac.getNumerator();
int denom = frac.getDenominator();
gcd = Fraction.gcd(num, denom);
}
return frac;
}
public String getFractions() {
return result;
}
}
Here is a sample output produced when running the above code.
1. 64480/84728 simplifies to 8060/10591
2. 33376/79317 simplifies to 4768/11331
3. 50944/97026 simplifies to 25472/48513
4. 21339/45510 simplifies to 7113/15170
5. 35884/38628 simplifies to 8971/ 9657
6. 15148/17199 simplifies to 2164/ 2457
7. 72670/95005 simplifies to 14534/19001
8. 19810/44730 simplifies to 283/ 639
9. 61790/63956 simplifies to 30895/31978
10. 4824/ 5352 simplifies to 201/ 223