在类(理性)中使用两种方法来简化分数

时间:2019-04-09 23:23:48

标签: java

我对一类有理数有一个类定义。我的任务是能够对我放入主函数的任何分数进行加,乘和除。我的程序可以做到所有这些,但是我在简化分数方面遇到了麻烦。我想尝试并仅使用两种方法进行简化,例如public void reduce();private static gcd();

public class Rational {
    private int num;
    private int denom;

    public Rational() {
        num = 0;
        denom = 1;
    }

    public Rational(int n, int d) {
        num = n;
        denom = d;
        reduce();
    }

    public Rational plus(Rational t)    {
        int tnum = 0;
        int tdenom = 1;

        tnum = (this.num * t.denom) + (this.denom * t.num);
        tdenom = (t.denom * this.denom);

        Rational r = new Rational (tnum, tdenom);
        return r;
    }

    public Rational minus(Rational t) {
        int tnum = 0;
        int tdenom = 1;

        tnum = (this.num * t.denom) - (this.denom * t.num);
        tdenom = (t.denom * this.denom);

        Rational r = new Rational (tnum, tdenom);
        return r;
    }

    public Rational multiply(Rational t) {
        int tnum = 0;
        int tdenom = 1;

        tnum = this.num * t.num;
        tdenom = t.denom * this.denom;

        Rational r = new Rational (tnum, tdenom);
        return r;
    }

    public Rational divide(Rational t) {
        int tnum = 0;
        int tdenom = 1;

        tnum = this.num  / t.num;
        tdenom = this.denom / t.denom;

        Rational r = new Rational (tnum, tdenom);
        return r;
    }

    private static int gcd(int n, int d) {
        return gcd(d, n%d);
    }

    public void reduce() {
        //call gcd
        gcd(num, denom);

        //divide num and denom by gcd by 
        num = num / gcd(num,denom);
        denom = denom / gcd(num,denom);
    }

    public String toString() {
        return String.format("%d/%d", num, denom);
    }
}

public class RationalMain {
    public static void main(String[] args)  {
        Rational x = new Rational();
        Rational y = new Rational(1,4);
        Rational z = new Rational(1,2);

        //x = y - z;

        x = y.plus(z);
        System.out.printf("%s = %s + %s\n", x.toString(), y.toString(), z.toString());      

        x = z.minus(y);
        System.out.printf("%s = %s - %s\n", x.toString(), z.toString(), y.toString());

        x = z.multiply(y);
        System.out.printf("%s = %s * %s\n", x.toString(), z.toString(), y.toString());

        x = y.divide(z);
        System.out.printf("%s = %s / %s\n", x.toString(), y.toString(), z.toString());
    }
}

1 个答案:

答案 0 :(得分:0)

这不是实现最大公约数(GCD)的方法。在使代码正常工作之前,您至少需要修复 gcd()方法,因为当前它会递归直到 ArithmeticException(/为零) >生成。您可以通过以下方式完成任务:

private static int gcd(int num, int den) {
    num = Math.abs(num);      // if numerator is signed convert to unsigned.
    int gcd = Math.abs(den);  // if denominator is signed convert to unsigned.
    int temp = num % gcd;
    while (temp > 0) {
        num = gcd;
        gcd = temp;
        temp = num % gcd;
    }
    return gcd;
}

要将分数也转换为最低术语,您的 reduce()方法可能如下所示:如果它接受分数字符串作为参数(您可以修改方法参数,如果你喜欢):

/*
  A Fraction String can be supplied as: "1/2", or "2 1/2", or 
  "2-1/2, or "-2 32/64", or "-2-32/64". The last 2 examples are 
  negative fraction values.
*/
private String reduce(String fractionString) {
    // Fraction can be supplied as: "1/2", or "2 1/2", or "2-1/2".
    // Make sure it's a Fraction String that was supplied as argument...
    inputString = inputString.replaceAll("\\s+", " ").trim();
    if (!inputString.matches("\\d+\\/\\d+|\\d+\\s+\\d+\\/\\d+|\\d+\\-\\d+\\/\\d+")) {
        return null;
    }
    str2 = new StringBuilder();
    String wholeNumber, actualFraction;
    if (inputString.contains(" ")) {
        wholeNumber = inputString.substring(0, inputString.indexOf(" "));
        actualFraction = inputString.substring(inputString.indexOf(" ") + 1);
        str2.append(wholeNumber);
        str2.append(" ");
    }
    else if (inputString.contains("-")) {
        wholeNumber = inputString.substring(0, inputString.indexOf("-"));
        actualFraction = inputString.substring(inputString.indexOf("-") + 1);
        str2.append(wholeNumber);
        str2.append("-");
    }
    else {
        actualFraction = inputString;
    }
    String[] tfltParts = actualFraction.split("\\/");
    int tfltNumerator = Integer.parseInt(tfltParts[0]);
    int tfltDenominator = Integer.parseInt(tfltParts[1]);
    // find the larger of the numerator and denominator
    int tfltN = tfltNumerator;
    int tfltD = tfltDenominator;
    int tfltLargest;
    if (tfltNumerator < 0) {
        tfltN = -tfltNumerator;
    }
    if (tfltN > tfltD) {
        tfltLargest = tfltN;
    }
    else {
        tfltLargest = tfltD;
    }

    // Find the largest number that divides the numerator and
    // denominator evenly
    int tfltGCD = 0;
    for (int tlftI = tfltLargest; tlftI >= 2; tlftI--) {
        if (tfltNumerator % tlftI == 0 && tfltDenominator % tlftI == 0) {
            tfltGCD = tlftI;
            break;
        }
    }

    // Divide the largest common denominator out of numerator, denominator
    if (tfltGCD != 0) {
        tfltNumerator /= tfltGCD;
        tfltDenominator /= tfltGCD;
    }

    str2.append(String.valueOf(tfltNumerator)).append("/").append(String.valueOf(tfltDenominator));
    return str2.toString();
}

如您所见,整数也可以随分数一起提供,因此,如果您调用上述 reduce()方法,如下所示:

System.out.println(reduce("12-32/64"));
System.out.println(reduce("12 32/64"));

控制台窗口将显示:

12-1/2
12 1/2