Java Basics

Der berüchtigte FizzBuzz Test

Zuletzt aktualisiert am 29. Oktober 2018 von Michael Lossagk , 12 Min  • 
Der berüchtigte FizzBuzz Test

1. Aufgabenstellung


Hier nun die textuelle Beschreibung für den FizzBuzz Algorithmus:

  1. Schreiben Sie ein kurzes Programm, das jede Zahl von 1 bis 100 in einer neuen Zeile (oder Spalte) ausgibt.
  2. Für jedes Vielfache von 3, schreibe “Fizz” anstelle der Zahl.
  3. Für jedes Vielfache von 5, schreibe “Buzz” anstelle der Zahl.
  4. Für Zahlen, die ein Vielfaches von 3 und 5 sind, schreibe “FizzBuzz” statt der Zahl.

Die Anweisungen sind recht überschaubar und die Aufgabenstellung klingt erst einmal nicht so schwer, aber wie gehen wir hier am besten vor? Diese Frage werden wir in den nächsten Kapiteln Schritt für Schritt klären.

2. Zahlen von 1 bis 100 in einer neuen Zeile (oder Spalte) ausgeben


Für die geordnete Ausgabe von Zahlen benutzen wir am besten eine simple Zählschleife. In Java ist das der for-loop.

for (int i = 1; i <= 100; i++) {...}

Da wir bei 1 beginnen sollen schreiben wir entsprechend int i = 1 als Startwert und analog dazu stoppen wir den Schleifendurchlauf bei 100 mit i <= 100. Wir wollen im Intervall von $1 ... 100$ jede einzelne Zahl überprüfen, daher zählen wir die Schleifenvariable in jedem Durchlauf um eins hoch i++.

2. Für jedes Vielfache von 3, schreibe “Fizz” anstelle der Zahl


Die Zahlen, die sich bei der Multiplikation einer Zahl $a$ mit $1, 2, 3, ..., n$ ergeben, heißen Vielfache einer Zahl.

Beispiel: Die Vielfachen von $3$ sind: $3, 6, 9, 12, 15, ...$. Anders ausgedrückt, alle Zahlen, die sich ohne Rest durch 3 teilen lassen sind Vielfache dieser Zahl, also $3/3=1, 6/3=2, 9/3=3, ...$ Diese Eigenschaft können wir in Java mithilfe des Modulo Operator $%$ überprüfen. Die Anweisung 3 % 3 ergibt das Ergebnis 0, ebenso wie bspw. 6 % 3,9 % 3 und 12 % 3. Somit können wir einfach auf i % 3 == 0 prüfen, wenn wir wissen möchten ob eine Zahl ohne Rest durch 3 teilbar ist.

if (i % 3 == 0) {
  System.out.print("i ist durch 3 ohne Rest teilbar");
}

Dies können wir nun mit der Schleife kombinieren und wir erhalten:

for (int i = 1; i <= 100; i++) {
    if (i % 3 == 0) {
        System.out.print("Fizz ");
    } else {
        System.out.print(i + " ");
    }
}

Die Ausgabe lautet

1 2 Fizz 4 5 Fizz 7 8 Fizz 10 11 Fizz 13 14 Fizz 16 17 ...

Somit ist nun die Bedingung erfüllt, dass wir alle Zahlen von 1 bis 100 ausgeben, jedoch für alle Zahlen, die durch 3 teilbar sind Fizz anstelle der Zahl schreiben. Analog hierzu wird im nächsten Abschnitt gezeigt, wie wir die Bedingung für jedes Vielfache von 5 erfüllen.

3. Für jedes Vielfache von 5, schreibe “Buzz” anstelle der Zahl


Die Vorgehensweise für diese Bedingung ist nahezu identisch wie beim vorherigen Abschnitt. Die Vielfachen von $5$ sind: $5, 10, 15, 20, 25, ...$. Anders ausgedrückt, alle Zahlen, die sich ohne Rest durch 5 teilen lassen sind Vielfache dieser Zahl, also $5/5=1, 10/5=2, 15/5=3, ...$, somit gilt auch 5 % 5 == 0, 10 % 5 == 0, 15 % 5 == 0 usw. Das Code Snippet hierzu sieht folgendermaßen aus:

if (i % 5 == 0) {
  System.out.print("i ist durch 5 ohne Rest teilbar");
}

Dies können wir nun mit der Schleife kombinieren und wir erhalten:

for (int i = 1; i <= 100; i++) {
    if (i % 5 == 0) {
        System.out.print("Buzz ");
    } else {
        System.out.print(i + " ");
    }
}

Die Ausgabe lautet

1 2 3 4 Buzz 6 7 8 9 Buzz 11 12 13 14 Buzz 16 17 18 19 Buzz 21 22 23 24 Buzz ...

Somit ist nun die Bedingung erfüllt, dass wir alle Zahlen von 1 bis 100 ausgeben, jedoch für alle Zahlen, die durch 5 teilbar sind Buzz anstelle der Zahl schreiben. Nun sind 3 von 4 Bedingungen erfüllt. Widmen wir uns nun noch der letzten Bedingung.

4. Für Zahlen, die ein Vielfaches von 3 und 5 sind, schreibe “FizzBuzz” statt der Zahl


Für diese Bedingung müssen wir das kleinste gemeinsame Vielfache (kgV) von 3 und 5 berechnen. Das es sich bei den beiden Zahlen um Primzahlen handelt ist das kgV schnell gefunden. Wir müssen die beiden Zahlen einfach miteinander multiplizieren und erhalten $3 x 5 = 15$. Somit ist 15 das Vielfache von 3 und 5, was wiederum bedeutet, dass wir auf folgende Bedingung prüfen können:

if (i % 15 == 0) {
  System.out.print("i ist durch 15 ohne Rest teilbar");
}

Dies können wir nun mit der Schleife kombinieren und wir erhalten:

for (int i = 1; i <= 100; i++) {
    if (i % 5 == 0) {
        System.out.print("FizzBuzz ");
    } else {
        System.out.print(i + " ");
    }
}

Die Ausgabe lautet

1 2 3 4 5 6 7 8 9 10 11 12 13 14 FizzBuzz 16 17 18 19 20 21 22 23 24 25 26 27 28 29 FizzBuzz 31 32 33 34 35 36 37 38 39 40 41 42 43 44 FizzBuzz ...

Damit ist auch die letzte Bedingung erfüllt. Wir geben alle Zahlen von 1 bis 100 aus und schreiben für alle Zahlen, die durch 3 und 5 (=15) teilbar sind FizzBuzz anstelle der Zahl. Jetzt müssen wir die Bedingungen noch kombinieren was im nächsten Kapitel gezeigt wird.

5. FizzBuzz


Wir haben nun die einzelnen Bedingung erfüllt, jedoch müssen diese noch kombiniert werden um das gewünschte Ergebnis zu erhalten. Hierbei müssen wir beachten, dass wir die Bedingung für die Teilbarkeit durch 3 und 5 als erste Schreiben. Die ist wichtig, da sonst ein falsches Ergebnis erzeugt wird. Hierzu ein Beispiel

if (i % 3 == 0) {
    System.out.print("Fizz ");
} else if (i % 5 == 0) {
    System.out.print("Buzz ");
} else if (i % (3 * 5) == 0) {
    System.out.print("FizzBuzz ");
} else {
    System.out.print(i + " ");
}

Wenn wir, wie in dem Beispiel oben, zuerst auf die Teilbarkeit durch 3, dann durch 5 und schließlich durch 3 und 5 zusammen prüfen, würden wir niemals FizzBuzz ausgeben, da jede Zahl, die durch 3 und 5 zusammen teilbar ist auch durch 3 teilbar ist. Daher wird immer erst diese Bedingung erfüllt. Das falsche Ergebnis würde folgendermaßen aussehen:

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 Fizz ...

Wie man erkennt, wird niemals FizzBuzz ausgegeben (zusammengeschrieben, nicht durch Fizz 'Leerzeichen' Buzz täuschen lassen). Aus diesem Grund ist es wichtig zunächst auf die Teilbarkeit durch 3 und 5 zusammen zu testen. Somit stellen wir den Code folgendermaßen um:

if (i % (3 * 5) == 0) {
    System.out.print("FizzBuzz ");
} else if (i % 3 == 0) {
    System.out.print("Fizz ");
} else if (i % 5 == 0) {
    System.out.print("Buzz ");
} else {
    System.out.print(i + " ");
}

Die Ausgabe lautet nun

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 ...

Wie man erkennt wird die 3 durch Fizz ersetzt, die 5 durch Buzz ersetzt, die 6 durch Fizz ersetzt, die 9 durch Fizz ersetzt, die 10 durch Buzz ersetzt, die 12 durch Fizz ersetzt und schließlich die 15 durch FizzBuzz ersetzt, usw.

Damit haben wir alle Bedingungen erfüllt und die Aufgabe gelöst. Hier der komplette Code:

public void doFizzBuzz() {
    for (int i = 1; i <= 100; i++) {
        // print 'FizzBuzz' in place of the number for numbers divisible by 3 and 5
        if (i % (3 * 5) == 0) {
            System.out.print("FizzBuzz ");
            // print 'Fizz' in place of the number for numbers divisible by 3
        } else if (i % 3 == 0) {
            System.out.print("Fizz ");
            // print 'Buzz' in place of the number for numbers divisible by 5
        } else if (i % 5 == 0) {
            System.out.print("Buzz ");
        } else {
            System.out.print(i + " ");
        }
    }
}

Probiere es aus (wenn es mit Chrome nicht funktioniert, dann erlaube Third Party Cookies oder nutze einen anderen Browser):

6. Zusammenfassung


In diesem Tutorial habe ich den berüchtigten FizzBuzz Algorithmus vorgestellt. Dieser Algorithmus ist deshalb so interessant, da er, trotz seiner Einfachheit, gerne in Vorstellungsgesprächen bzw. Job Interviews abgefragt wird. Erschreckenderweise haben viele Bewerber damit Probleme was schnell zur Ablehnung bei einem solchen Gespräch führen kann und man somit keinerlei Chance auf die gewünschte Anstellung hat. Die passenden Code Beispiele findest du in meinem GitLab Repository. Falls du weitere Informationen zum Thema Java und Programmieren erfahren möchtest kann ich dir dieses Buch empfehlen.


Michael Lossagk
Michael Lossagk
Coding Enthusiast
Founder @ TechDiffuse

Vielleicht gefällt dir auch


Share this: