u20 euklidischer algorithmus

This commit is contained in:
Luca Conte 2023-05-17 16:51:17 +02:00
parent 3775c742da
commit cf145ceeed
2 changed files with 28 additions and 19 deletions

Binary file not shown.

View File

@ -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 * Liefert den Bruch in gehashter Form
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
/* Absolute Werte bestimmen int ggt = this.getGgT();
* Um redundanz zu vermeiden und Rechenleistung zu sparen int sign = 1;
* 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;
}
}
/* /*
* Vorzeichen bestimmen * Vorzeichen bestimmen
*/ */
if (this.zaehler < 0) i *= -1; if (this.zaehler < 0) sign *= -1;
if (this.nenner < 0) i *= -1; if (this.nenner < 0) sign *= -1;
/* /*
* Hash des Bruchs berechnen. * Hash des Bruchs berechnen.
* Wenn negativ wird immer der Zähler als negativ angegeben, nie der Nenner. * Wenn negativ wird immer der Zähler als negativ angegeben, nie der Nenner.
* Sorgt dafür dass -1/2 == 1/-2 * 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);
} }