减少负分数

时间:2016-04-12 13:34:52

标签: java reduce fractions

所以我在减少负分数方面遇到了一些问题

这是我的缩减代码

private void reduce() {
    int g = Helper.gcd(this.num, this.den);

    num /= g;
    den /= g;
}

例如: 8/64给出1/8

但是让-8/64让程序崩溃

这是我的gcd代码

public static int gcd(int a, int b) {
     while (a != b) {
        if (a > b) {
            a -= b;
        } else {
            b -= a;
        }
    }
    return a;
}

2 个答案:

答案 0 :(得分:2)

您需要先提取标志。

private void reduce() {
    boolean neg = (num < 0) != (den < 0);
    num = Math.abs(num);
    den = Math.abs(den);
    // obtain the GCD of the non-negative values.
    int g = Helper.gcd(num, den);

    num /= g;
    den /= g;
    if (neg) num *= -1;
}

答案 1 :(得分:1)

您的gcd方法仅适用于正数。负数和零需要单独处理。

public static int gcd(int a, int b) {
    a = Math.abs(a);
    b = Math.abs(b);
    if (a == 0) {
        if (b == 0)
            throw new IllegalArgumentException();
        return b;
    }
    if (b == 0)
        return a;
    // The rest is just your code, unchanged.
    while (a != b) {
        if (a > b) {
            a -= b;
        } else {
            b -= a;
        }
    }
    return a;
}