2016-04-12 19 views
1

So habe ich ein kleines Problem mit einem negativen Anteil reduziertVerringerung der negativen Fraktion

Dies ist mein reduzieren Code

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

    num /= g; 
    den /= g; 
} 

Zum Beispiel: 8/64 gibt 1/8

Aber geben -8/64 Lassen Sie uns das Programmabsturz

das ist mein gcd Code

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

Nur als Randnotiz: solcher Code ist wirklich ** perfekt ** für Komponententests. Das hat den großen Vorteil, dass Sie direkt in den Debugger springen, falls einer Ihrer Tests fehlschlägt. – GhostCat

+0

Ein weiteres kleines Ding: a und b sind ziemlich schlechte Namen für Variablen. Gib deinen Dingen Namen, die sagen, was sie sind. – GhostCat

Antwort

2

Sie müssen das Zeichen zuerst extrahieren.

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

Funktioniert wie ein Charme! – Skupaj

1

Ihre Methode gcd funktioniert nur für positive Zahlen. Negative Zahlen und Null müssen getrennt behandelt werden.

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; 
} 
Verwandte Themen