Ich hatte mich jetzt mal an Spacerats Lösung orientiert und bei mir sieht’s wie folgt aus (entschuldigt bitte die zu ausführlichen Kommentierungen, die haben aber ihren Grund xD):
public static void main(String[] args) {
/* Niedrigste Münze */
int min = 1;
/* Höchste Münze */
int max = 1000;
/* Mittelwert, linkes und rechtes Minimum und Maximum */
int mid, lMin, lMax, rMin, rMax;
/* Abfragevariable */
int a;
/* Variable für die Ausgabe der Lösung */
int loesung = 0;
/* Boolescher Wert, ob die falsche Münze gefunden wurde */
boolean gefunden = false;
/* Es werden Ja-Nein-Fragen gestellt, die der Benutzer mit 0 für "Nein" und 1 für "Ja" beantworten kann */
System.out.println("0 = Nein, 1 = Ja");
/* Do-while-Schleife mit Ja-Nein-Fragen, um die falsche Münze zu finden */
do {
/* Zuweisung der Minima-/Maxima-/Mittelwert-Variablen */
mid = (min + max) / 2;
lMin = min;
lMax = mid;
rMin = mid + 1;
rMax = max;
/* Muss eine ungerade Anzahl an Münzen aufgeteilt werden, wird die Münze des rechten Minimums beiseite gelegt.
* Es wird gefragt, ob nun beide Münzhaufen gleich schwer sind.
*/
if ((max - min + 1) % 2 != 0) {
rMin++;
System.out.println("Links liegt "+lMin+" bis "+lMax+", rechts liegt "+rMin+" bis "+rMax+".");
a = IO.readInt("Sind beide Münzhaufen gleich schwer?: ");
/* Wenn ja, ist die beiseite gelegte Münze die falsche Münze und die Nummer wird der Variablen "loesung" zugewiesen.
* Wenn nicht, fällt die Münze weg und es wird normal fortgefahren.
*/
if (a == 1) {
loesung = rMin--;
gefunden = true;
} /* end if */
} /* end if */
/* Wenn die Münze noch nicht gefunden wurde und eine gerade Anzahl an Münzen aufgeteilt wurde,
* wird angezeigt auf welcher Seite der Waagschale welche Münzen (von/bis) liegen.
* Es wird gefragt, ob der rechte Münzhaufen schwerer ist.
*/
if (!gefunden) {
System.out.println("Links liegt "+lMin+" bis "+lMax+", rechts liegt "+rMin+" bis "+rMax+".");
a = IO.readInt("Ist der Münzhaufen rechts schwerer?: ");
/* Wenn ja, dann liegt die falsche Münze auf der linken Seite und das linke Minimum wird zum generellen Minimum,
* sowie das linke Maximum zum generellen Maximum.
*/
if (a == 1) {
min = lMin;
max = lMax;
/* Wenn nein, dann liegt die falsche Münze auf der rechten Seite und das rechte Minimum wird zum generellen Minimum,
* sowie das rechte Maximum zum generellen Maximum.
*/
} else {
min = rMin;
max = rMax;
} /* end if-else */
} /* end if */
/* Wenn Maximum vom Minimum subtrahiert 0 ergibt, ist "max" die falsche Münze und wird der Variablen "loesung" zugewiesen. */
if (min - max == 0) {
loesung = max;
gefunden = true;
} /* end if */
/* Die do-while-Schleife wird mindesten einmal ausgeführt und wiederholt sich dann, solange die gefälschte Münze nicht gefunden wurde. */
} while (!gefunden); /* end do-while */
/* Ausgabe der Nummer der falschen Münze */
System.out.println("Münze Nummer "+loesung+" ist die gefälschte Münze.");
} /* end main */
} /* end class */```
An folgender Stelle liegt jetzt aber das Problem:
/* Muss eine ungerade Anzahl an Münzen aufgeteilt werden, wird die Münze des rechten Minimums beiseite gelegt.
-
Es wird gefragt, ob nun beide Münzhaufen gleich schwer sind.
*/
if ((max - min + 1) % 2 != 0) {
rMin++;
System.out.println(“Links liegt “+lMin+” bis “+lMax+”, rechts liegt “+rMin+” bis “+rMax+”.”);
a = IO.readInt("Sind beide Münzhaufen gleich schwer?: ");
/* Wenn ja, ist die beiseite gelegte Münze die falsche Münze und die Nummer wird der Variablen “loesung” zugewiesen.
- Wenn nicht, fällt die Münze weg und es wird normal fortgefahren.
/
if (a == 1) {
loesung = rMin–;
gefunden = true;
} / end if */
} /* end if */```
Wenn der Abstand zwischen den Münzen sehr klein wird, wird die Ausgabe und damit dann ja auch die Berechnung falsch.
Ich hatte als Beispielzahl 736 ausprobiert und irgendwann landete ich bei folgender Ausgabe:
Links liegt 731 bis 733, rechts liegt 734 bis 736.
Ist der Münzhaufen rechts schwerer?: 0
Links liegt 734 bis 735, rechts liegt 737 bis 736.
Sind beide Münzhaufen gleich schwer?:
Ich könnte es zwar mit if-else lösen, aber das wäre ziemlich unschön. Gibt es da irgendwie eine bessere Möglichkeit?
Das Problem ist, dass ich zwingend “Sind beide Münzhaufen gleich schwer?” fragen muss.