u20 euklidischer algorithmus
This commit is contained in:
parent
3775c742da
commit
cf145ceeed
Binary file not shown.
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue