I've been picking through this code for a while and can't find out why the code won't continue to execute after the user has entered all of their fractions from the console. Here's the code:
Edit - added Fraction class below. May be the toString function on this class?
package AddingFractions;
import java.util.Scanner;
public class AddingFractions {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("How many fractions are you adding?");
int numOfFractions = input.nextInt();
input.nextLine();
Fraction[] fractions = new Fraction[numOfFractions];
System.out.println("Enter fractions in format Num/Denom: ");
String[] userFraction = input.nextLine().split("/");
//add all fractions to the array
for(int i = 0; i < numOfFractions - 1; i++){
//takes user input and initializes fractions with long values
fractions[i] = new Fraction(Long.parseLong(userFraction[0]),Long.parseLong(userFraction[1]));
System.out.println("Next fraction: ");
userFraction = input.nextLine().split("/");
}
//add fractions together consecutively, reducing as it goes
for(int i = 0; i < numOfFractions - 1; i++){
fractions[i+1] = Fraction.reduce(Fraction.addFractions(fractions[i], fractions[i + 1]));
fractions[i] = null;
for(int j = 0; j < numOfFractions - 1; j++){
System.out.println(fractions[j]);
}
}
//prints final reduced fraction
System.out.println(fractions[numOfFractions - 1].getNumerator() + " / " +
fractions[numOfFractions - 1].getDenominator());
}
And here is a sample interaction with the console. I can keep pressing ENTER at the end and I'm still not getting to any of the other statements.
How many fractions are you adding?
3
Enter fractions in format Num/Denom:
4/65
Next fraction:
45/100
Next fraction:
3/10
Fraction class
package AddingFractions;
public class Fraction {
private long numerator;
private long denominator;
public Fraction(long newNumerator,long newDenominator){
this.numerator = newNumerator;
this.denominator = newDenominator;
}
public long getNumerator() {
return numerator;
}
public void setNumerator(long newNumerator) {
this.numerator = newNumerator;
}
public void setDenominator(long newDenominator) {
this.denominator = newDenominator;
}
public long getDenominator() {
return denominator;
}
public static Fraction addFractions(Fraction fractionA, Fraction fractionB) {
//gcd = greatest common denominator
long gcd = getGreatestCommonDenominator(fractionA, fractionB);
//multiples all values by the gcd
fractionA.setNumerator(fractionA.getNumerator() * gcd);
fractionA.setDenominator(fractionB.getDenominator() * gcd);
fractionB.setNumerator(fractionB.getNumerator() * gcd);
fractionB.setDenominator(fractionB.getDenominator() * gcd);
//adds fractions together and returns new fraction
return new Fraction((fractionA.getNumerator()+fractionB.getNumerator()),
(fractionB.getDenominator()+fractionA.getDenominator()));
}
public static long getGreatestCommonDenominator(Fraction fractionA, Fraction fractionB) {
long aDenom = fractionA.getDenominator();
long bDenom = fractionB.getDenominator();
if(aDenom == 0){
return bDenom;
}
while (bDenom != 0){
if(bDenom > aDenom){
aDenom = aDenom - bDenom;
}
else{
bDenom = bDenom - aDenom;
}
}
return aDenom;
}
public static long getGreatestCommonDivisor(long a, long b){
if(a == 0){
return b;
}
while (b != 0){
if(b > a){
a = a - b;
}
else{
b = b - a;
}
}
return a;
}
public static Fraction reduce(Fraction unreducedFraction){
long gcd = getGreatestCommonDivisor(unreducedFraction.getNumerator(),unreducedFraction.getDenominator());
long newDenominator = unreducedFraction.getDenominator()/gcd;
long newNumerator = unreducedFraction.getNumerator()/gcd;
Fraction reducedFraction = new Fraction(newNumerator, newDenominator);
return reducedFraction;
}
}
答案 0 :(得分:1)
你的问题在这里:
while (bDenom != 0){
if(bDenom > aDenom){
aDenom = aDenom - bDenom;
}
else{
bDenom = bDenom - aDenom;
}
}
无限循环。
如果您尝试使用&lt; 3 fractions
运行程序,也会出现一堆错误