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
*/
@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);
}