2016-04-12 2 views
1

Таким образом, у меня есть небольшая проблема с сокращением отрицательной фракцииСнижение отрицательной фракции

Это мое уменьшить код

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

    num /= g; 
    den /= g; 
} 

Например: 8/64 дает 1/8

Но давая -8/64 крах программы ДАВАЙТЕ

Это мой НОД код

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

Как примечание стороны: такой код действительно ** совершенен ** для модульного тестирования. Это имеет большое преимущество в том, что вы сразу переходите в отладчик, если один из ваших тестов не работает. – GhostCat

+0

Еще одна незначительная вещь: a и b - довольно плохие имена переменных. Дайте имена ваших вещей, которые говорят, что они. – GhostCat

ответ

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

Работает как очарование! – Skupaj

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; 
} 
Смежные вопросы