von 1 - 100 Java
Hallo,
Ich habe in Java eine Schleife erstellt, die mir die Zahlen von 1 - 100 ausgibt. Soweit nicht schwer. Jetzt muss ich aber alle zahlen, die durch 3 und 5 teilbar sind durch ein Wort ersetzen, was nicht so ganz funktioniert, wie ichs mir vorstelle. Ich weiß auch nicht, wo ich das letzte System.out.println am besten hinstecken soll ^^
Hier mal das, was ich bis jetzt habe:
public class SuperDividierer3000 {
public static void main(String[] args) {
int i = 1;
while (i < 101) {
if (i%3==0){
System.out.println("Fizz");
}
if (i%5==0){
System.out.println("Buzz");
}
if (i%3==0 && i/5==0){
System.out.println("FizzBuzz");
}
System.out.println(i++); //was mach ich damit?
}
}
}
Danke im Voraus!

7 Antworten
Von mir noch eine Ergänzung:
Wenn du schon einen festen Zahlenbereich kennst, in dem du arbeiten möchtest, bietet sich auch die for-Schleife an. In dieser gibts du ja Startwert, Endwert sowie die Aktion an, die ausgeführt wird, wenn der Schleifenkörper einmal durchlaufen wurde.
for(int i = 1; i <= 100; i++)
{
if(i%3==0 && i%5==0)
//do
else if(i%5==0)
//do
else if(i%3==0)
//do
else
//do
}
Wie du siehst fehlt hier das i++, also das Inkrementieren des Zählers(+1), im Körper. Dieses findet sich aber im Schleifenkopf wieder. Bei jedem durchlauf wird als i + 1 gerechnet, nachdem alles abgearbeitet wurde. Brauchst dich darum also nicht zu kümmern.
Durch die Verknüpfung der If-Abfragen durch die else-Schlüsselwörter wird immer nur exakt eine Abfrage positiv ausgewertet. Das verhindert hier zB, dass bei der 15 Buzz und FizzBuss ausgegeben bekommst.
Bei sowas hilft es ungemein, wenn man sich einen Zettel und einen Stift nimmt, und die Schleife, die man geschrieben hat, mal per Hand selbst durchgeht. Dann siehst du nämlich genau, was die Schleife tut.
Du überprüfst nacheinander drei Bedingungen per if. Bei jeder zutreffenden Bedingung wird der entsprechende Block ausgeführt, und am Ende noch die Zahl ausgegeben. Das ist aber nicht das, was du willst. Du willst, dass entweder Block 1 oder Block 2 oder Block 3 oder die Zahl ausgegeben wird, abhängig von der Bedingung.
Statt drei if-Anweisungen brauchst du also ein if-else-Konstrukt.
Als zweites musst du dann noch mit der Reihenfolge aufpassen. Würdest du deine jetzige Reihenfolge in einem if-else-Konstrukt umsetzen, würde bei jeder durch 3 oder durch 5 teilbaren Zahl der entsprechende Block ausgeführt und das Konstrukt verlassen, die Prüfung "durch 3 und 5 teilbar" würde nie ausgeführt. Folglich musst du diesen Test als erstes ausführen.
Tutto kompletto:
while (i < 101) {
// ist die Zahl durch 3 und 5 teilbar?
if ((i % 3 == 0) && (i % 5 == 0)) {
// schreibe "FizzBuzz"
System.out.println("FizzBuzz");
// SONST: ist sie denn durch 3 teilbar?
} else if (i % 3 == 0) {
// schreibe "Fizz"
System.out.println("Fizz");
// SONST: ist sie wenigstens durch 5 teilbar?
} else if (i % 5 == 0) {
// schreibe "Buzz"
System.out.println("Buzz");
// SONST:
} else {
// schreibe einfach nur die Zahl
System.out.println(i++);
}
}
Stimmt! Die Sysout-Anweisung darf nur i ausgeben und der Inkrement muss nach dem if-else-Konstrukt erfolgen. Danke für die Ergänzung!
wenn wir wissen wie oft etwas ausgeführt werden soll, DANN NEHMEN WIR EINE FOR-SCHLEIFE
Beim
if (i%3==0 && i/5==0)
musst du logischerweise statt / auch % hinschreibenDas
System.out.println(i++);
ist nicht an eine Bedingung geknüpft. Also i darfst du ja nur ausgeben, wenn die Zahl weder durch 3 noch durch 5 teilbar ist. Das i++ musst du dann logischerweise extra hinschreiben, sonst baust du dir ne Endlosschleife."Was mach ich damit?" Damit gibst du den aktuellen Wert der Variable i aus und erhöhst 1 gleichzeitig um 1.
Danke für die Antwort. Jetzt funktionierts einwandfrei =)
oh, eine Sache noch: Bei Zahlen, die durch 3 und 5 teilbar sind (Beispiel: 15) gibt dein Programm "Fizz" und "Buzz" aus. Das liegt daran, dass die nächste If-Bedingung geprüft und ausgeführt wird, obwohl die letzte Bedingung auch schon wahr war. Da musst du also mit else
arbeiten.
Mein Vorredner hat recht.
Verknüpfe deine If klauslen doch m it else damit jede zahl einmal durchgeprüft wird also so ungefähr:
int i = 1;
while (i <= 100) {
if (i%3==0){
if (i%5==0){
System.out.println("FizzBuzz");
}
else
{
System.out.println("Fizz");
}
}
else
{
//blablabla noch mehr krams, denk selbst drüber nach ;)
}
else
{
System.out.println(i++); //was mach ich damit?
}
}
Edit: Bla, fehlöer drin. egal, hast ja glaub ich selbst schon hinbekommen ;)
Das FizzBuzz (nach dem das hier aussieht) ist ein relativ beliebter Test, um z.B. bei Bewerbungen die Qualität eines Programmierers einschätzen zu können. Die algorithmisch klügste Lösung wäre
for(int i=1;i<=100;i++)
{
if((i % 3 != 0) && (i % 5 != 0))
{
System.out.println(i);
}
if(i % 3 == 0)
{
System.out.println("Fizz");
}
if(i % 5 == 0)
{
System.out.println("Fizz");
}
}
außerdem nur bedingt richtig.
FizzBuzz soll auf EINER zeile ausgegeben werden
und sowas fragen die ? omg, bei euch wird wohl jeder genommen der nen pc anschalten kann ?
die stelen also jeden ein ? ok, ich schmeiß die schule und wird programmierer bei Google und diese schwren interview fragen sind nur eine Erfindung von hollywood
Nun, die Original-Aufgabe lautet ja eigentlich:
- bei Zahlen, die durch 3 teilbar sind, gib "Fizz" aus
- bei Zahlen, die durch 5 teilbar sind, gibt "Buzz" aus
- bei Zahlen, die durch 3 und durch 5 teilbar sind, gibt "FizzBuzz" aus
Die FizzBuzz-Aufgabe ist erstmal nur ein Einstieg, um beim Bewerbungsgespräch die Zocker von den Programmierern zu trennen, danach kommen noch mehr und schwerere Fragen. Ausserdem ist das eben auch ein kleiner Logiktest, wenn die Ausgabe von "Fizz" und "Buzz" teure Operationen wären, dann würden die Lösungen der anderen hier sich in der Laufzeit von meiner unterscheiden. Du musst auch bedenken, dass man im Gespräch nicht soviel Zeit hat und deswegen kleine Fragen stellen muss. Hier sind übrigens auch ein paar Fragen aus dem Microsoft-Bewerbungsgespräch, du interessierst dich ja für sowas.
die ersten fragen sind aber ein scherz oder ? (warum nehmen so viele java bei den ms interviews ?)
oh, moment. mit linked lists hab ich mich noch nicht befasst
die 9er ist recht bekannt.
ich hab mal ne abgewandelte gelöst (einen string überprüfen)
Damit baust du dir eine Endlosschleife, weil
i++
nur ausgeführt wird, wenn die Zahl weder durch 3 noch durch 5 teilbar ist.Wahrscheinlich wäre es wirklich am besten, wie Niklas schon gesagt hat, eine For-Schleife daraus zu machen, damit sowas nicht passiert.