diff --git a/.nfs000000000157ded700000020 b/.nfs000000000157ded700000020 deleted file mode 100644 index 11ac226..0000000 Binary files a/.nfs000000000157ded700000020 and /dev/null differ diff --git a/u20/src/Bruch.java b/u20/src/Bruch.java index 8679bcd..fe4d9c6 100644 --- a/u20/src/Bruch.java +++ b/u20/src/Bruch.java @@ -87,40 +87,49 @@ public class Bruch { */ } + /** + * Findet mittels des Euklidischen Algorithmus den größten + * gemeinsamen Teiler des Zählers und des Nenners des Bruchs + * @return Größter gemeinsamer Teieler + */ + public int getGgT() { + int z = Math.abs(this.zaehler); + int n = Math.abs(this.nenner); + + if (z == 0) { + return 0; + } + + while (n != 0) { + if (z > n) { + z -= n; + } else { + n -= z; + } + } + return z; + } + /** * Liefert den Bruch in gehashter Form */ @Override public int hashCode() { - /* Absolute Werte bestimmen - * Um redundanz zu vermeiden und Rechenleistung zu sparen - * werden sie in temporären Variablen gespeichert - */ - int absZ = Math.abs(this.zaehler); - int absN = Math.abs(this.nenner); - - /* - * Größten gemeinsamen Teiler bestimmen - */ - int i; - for (i = Math.min(absZ, absN); i > 0; i--) { - if (absZ % i == 0 && absN % i == 0) { - break; - } - } + int ggt = this.getGgT(); + int sign = 1; /* * Vorzeichen bestimmen */ - if (this.zaehler < 0) i *= -1; - if (this.nenner < 0) i *= -1; + if (this.zaehler < 0) sign *= -1; + if (this.nenner < 0) sign *= -1; /* * Hash des Bruchs berechnen. * Wenn negativ wird immer der Zähler als negativ angegeben, nie der Nenner. * Sorgt dafür dass -1/2 == 1/-2 */ - return Objects.hash(absZ / i, absN / Math.abs(i)); + return Objects.hash(Math.abs(this.zaehler) / ggt * sign, Math.abs(this.nenner) / ggt); }