2017-01-07 73 views
2

我正在为我的AP计算机科学课做一个java分数计算器,并且我的减少方法有问题。我认为这只是返回输入的第一个小数部分作为简化答案。例如,4/5 * 5/4在不减少方法调用的情况下返回20/20。这个答案是正确的,但是当我应用我的reduce方法时,它返回4/5(第一个分数)而不是1(或1/1)任何反馈总是有帮助的。这里是我的代码:Java分数计算器减少方法

// begin fraction class. 
public class Fraction { 
    // instance variables for the first fractions numerator and denominator. 
    private int numerator; 
    private int denominator; 


    public Fraction(String fraction) { 

     // This if statement checks for mixed numbers (indicated by the underscore) 
     if (fraction.contains("_")) { 
      // gets from 0 to before the first underscore is present to find the value of the whole number in the string. 
      int wholeNumber1 = Integer.parseInt(fraction.substring(0, fraction.indexOf("_"))); 

      // does the same for numerator. 
      numerator = Integer.parseInt(fraction.substring(fraction.indexOf("_") + 1, fraction.indexOf("/"))); 

      // does the same for denominator. 
      denominator = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 

      // sets mixed numbers into improper fractions 
      numerator = (wholeNumber1 * denominator) + numerator; 


     } else if (fraction.contains("/")) { 
      // this if statement checks for regular fractions. 

      // locates the numerator in the string. 
      numerator = Integer.parseInt(fraction.substring(0, fraction.indexOf("/"))); 

      //locates the denominator in the string 
      denominator = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 

     } else { 
      // this else statement assumes that the user enters a whole number. 

      int wholeNumber2 = Integer.parseInt(fraction.substring(0)); 
      numerator = wholeNumber2; 
      // puts the whole number over 1 to make an improper fraction. This will probably be reduced in another method. 
      denominator = 1; 

     } 

    } // end of Fraction constructor 


    // Starting methods for checkpoint 4+ 

    public Fraction (int numerator, int denominator) { 

     // we used this.numerator and this.denominator to make it clear which variable is being referred to. 
     this.numerator = numerator; 
     this.denominator = denominator; 

    } // end of second Fraction constructor. 

    // method for formatting fractions. 
    public String toString() { 
     return String.valueOf(numerator) + "/" + String.valueOf(denominator); 
    } 

    // multiply method. 
    public Fraction multiply(Fraction secondFraction) { 

     int productOfNumerators = numerator * secondFraction.numerator; 
     int productOfDenominators = denominator * secondFraction.denominator; 

     // object to call the second constructor. 
     Fraction product = new Fraction(productOfNumerators, productOfDenominators); 
     return product; 

    } // end multiply method 

    // divide method. 
    public Fraction divide(Fraction secondFraction) { 

     // product of numerators and denominators for cross multiplication. 
     int productOfNumerators = numerator * secondFraction.denominator; 
     int productOfDenominators = denominator * secondFraction.numerator; 

     // object to call the second constructor. 
     Fraction quotient = new Fraction(productOfNumerators, productOfDenominators); 

     return quotient; 
    } // end divide method 

    // add method. 
    public Fraction add(Fraction secondFraction) { 

     if(denominator != secondFraction.denominator) { 

      int sumOfDenominators = denominator * secondFraction.denominator; 
      int newNumeratorOne = numerator * secondFraction.denominator; 
      int newNumeratorTwo = secondFraction.numerator * denominator; 
      int sumOfNumerators = newNumeratorOne + newNumeratorTwo; 

      Fraction sum = new Fraction(sumOfNumerators, sumOfDenominators); 
      return sum; 
     } else { 

      int sumOfNumerators = numerator + secondFraction.numerator; 
      Fraction sum = new Fraction(sumOfNumerators, denominator); 
      return sum; 
     } 

    } // end add method. 

    // subtract method. 
    public Fraction subtract(Fraction secondFraction) { 

     if(denominator != secondFraction.denominator) { 

      int differenceOfDenominators = denominator * secondFraction.denominator; 
      int newNumeratorOne = numerator * secondFraction.denominator; 
      int newNumeratorTwo = secondFraction.numerator * denominator; 
      int differenceOfNumerators = newNumeratorOne - newNumeratorTwo; 

      Fraction difference = new Fraction(differenceOfNumerators, differenceOfDenominators); 
      return difference; 
     } else { 

      int sumOfNumerators = numerator - secondFraction.numerator; 
      Fraction difference = new Fraction(sumOfNumerators, denominator); 
      return difference; 
     } 

    } // end subtract method. 

    // reduce method. 
    public Fraction reduce (Fraction secondFraction) { 
     int numerator_abs = Math.abs (numerator); 
     int denominator_abs = Math.abs (denominator); 

     int min_num = Math.min(numerator_abs, denominator_abs); 

     Fraction reducedAnswer = new Fraction(numerator_abs, denominator_abs); 

     for (int i = 1; i <= min_num; i++) { 
      if (numerator%i == 0 && denominator%i == 0){ 
       i++; 
      }//end if 
     }//end for 
     return reducedAnswer; 

    }//end reduce 



} // end class 

回答

2

在reduce函数中,你不会改变reducedAnswer,所以你不会真的减少分数。

此外,你正在返回分数的abs值,女巫可能不是你想要的。

顺便说一句 - 你可能想用https://en.wikipedia.org/wiki/Euclidean_algorithm找到减少过程中的最大公约数。

0

你可以写你的方法减少这样

public void reduce() 
{ 
    BigInteger num = BigInteger.valueOf(numerator); 
    int gcd = num.gcd(BigInteger.valueOf(denominator)).intValue(); 

    this.denominator /= gcd; 
    this.numerator /= gcd; 

} 
0

你减少方法简单地设置您减少循环,这本身似乎没有任何效果之前的结果。鉴于减少是一个纯粹的分数特征,它应该是你的分数类的一种方法。 Elucid的GCD对于计算最大公分母更有效。鉴于此,我建议如下。

public class Fraction { 
    ... 

    public void reduce() { 
     int gcd = getGcd(numerator, denominator); 
     if (gcd == 1) 
      return; 
     else { 
      numerator /= gcd; 
      denominator /= gcd; 
     } 
    } 

    private int getGcd(int a, int b) { 
     if (b == 0) 
      return a; 
     else 
      return getGcd(a, a%b); 
    } 
}