wie zahlen von 1-99 addieren die nicht durch 3 teilbar sind(Informatik)?
Hey,
ich habe folgende Aufgabe von meinem Lehrer bekommen:
"Implementieren Sie mit einer while-Schleife eine Methode nichtDurchDrei(), die alle Zahlen von 1 bis 99, die nicht durch 3 teilbar sind, aufaddiert und ausgibt."
Leider war ich aus gesundheitlichen Gründen nicht anwesend, als mein Kurs die while Schleife durchgenommen hat und blicke dementsprechend nicht ganz durch. Nach einer Menge von Versuchen kapituliere ich nun, es klappt einfach nicht so ganz und ich weiß nicht woran es liegt.
Vielleicht kann mir ja einer von euch helfen meinen Fehler zu sehen.
(ich hab keine Ahnung was ich da gemacht habe, bitte verzeiht es mir wenn es völlig daneben gegriffen ist)
public static int nichtDurchDrei(int j){
int summe = 0;
while (j%3!=<99){
summe = summe+1;
j++;
}
return summe;
}
8 Antworten
Hallo
Im Grunde bist du auf dem richtigen Weg.
while ist eine Kopfgesteuerte Schleife; das heißt im "Kopf" wird eine Bedingung geprüft und je nach Wahrheitswert wird dann der Schleifenblock ausgeführt oder nicht.
for ist eine andere kopfgesteuerte Schleife und do-while eine fußgesteuerte (sei mal angemerkt, hattet ihr vielleicht noch nicht).
Du wendest auch schon mal den Modulo-Operator (%) an, das ist gut...nur der Vergleich passt nicht und die stelle ist falsch. Modulo gibt den rest einer ganzzahligen Division zurück, d.h.:
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2
6 % 3 = 0
...
Die Bedingung der while sollte sein, dass unser j, die Zählvariable die du nutzt, kleiner oder gleich 99 ist
In dem Schleifenkörper wird dann mit if geprüft ob j ohne rest durch 3 teilbar ist oder nicht und dann entsprechend summe angepasst.
public static int nichtDurchDrei()
{
int summe = 0, j = 1; // Variablen Definition und Initialisierung
// wir wollen alle Zahlen von
// 0 bis einschließlich 99 durchlaufen
// Unsere Schleife soll also nicht mehr durchlaufen werden,
// wenn j > 99 [Die Überprüfung mit 0 ist hier sinnfrei, weshalb ich
// j gleich mit 1 initialisiere]
while (j <= 99)
{
// Wenn j nicht durch drei teilbar ist,
// es also einen Rest gibt (ungleich 0),
// soll summe erhöht werden um j
if (j % 3 != 0)
{
summe += j;
}
j++; // Zählvariable erhöhen, sonst hätten wir eine endlosschleife ^^
}
return summe;
}
Noch Fragen?
zu 1. nichts muss in die Klammern, zu 2. der wert der variable summe muss ausgegeben werden, also: SystemyOut.Println(summe);
Siehe Deivil's Antwort; wobei zu 2), da muss ebenfalls nichts; da müsste nur was stehen, wenn bei 1) auch was in den Klammern wäre. Das wären dann (Übergabe-)Parameter; Aber wenn ihr das noch nicht hattet einfach leer lassen.
In 2) rufst du die Methode aus 1) ohne Parameter auf
While ist das falsche, mach's mit dir und a haue dir die richtige Verwendung von Modulo an, das ist bei dir nicht richtig.
Achso while muss sein OK, dann musst du nur eine for in eine while Schleife über tragen
Wenn ich dich richtig verstanden habe in etwa so:
(Hans am Handy getiolt, verzeih wenn da Fehler sind)
Int i=0:
Int sum=0;
While (i<100) {
If (i%3!=0) sum += i;
i++;
}
Das geht sogar in Form einer Art Scherzantwort ohne Modulo und ohne zusätzliche Bedingungen:
public static void nichtDurchDrei() {
int i = 0, sum = 0;
while (i++ < 99)
sum += i++ + i++;
System.out.println(sum);
}
Disclaimer: Nicht getestet! Hoffentlich kommt dabei das korrekte Ergebnis raus ...
Aber dein Lehrer will vermutlich lieber eine Lösung, wie in den anderen Antworten vorgeschlagen, sehen. :)
Aber dein Lehrer will vermutlich lieber eine Lösung, wie in den anderen Antworten vorgeschlagen, sehen. :)
Trotzdem spräche mMn nichts gegen eine Lösung wie deine. Immerhin ist das Ergebnis korrekt und die Aufgabenstellung wurde wortgenau befolgt:
Implementieren Sie mit einer while-Schleife eine Methode nichtDurchDrei()
while-Schleife: Check.
die alle Zahlen von 1 bis 99
Von 1 bis 99 (optionalerweise inkl. 0): Check.
die nicht durch 3 teilbar sind
Durch den Aufbau der Schleife werden ab inkl. der 1 immer je zwei Zahlen verwendet und eine übersprungen. Also: Check.
aufaddiert und ausgibt.
Besagte Zahlen summieren: Check.
Ergebnis ausgeben: Check.
Fazit: Würde der Lehrer diese (oder eine vergleichbare) Lösung vorgelegt bekommen und diese als falsch bewerten, dann sollte dieser Lehrer evtl. darüber nachdenken, seinen Fachbereich zu wechseln...
P.S.: Eine kleine Sache wäre da allerdings noch: Soll nur das Ergebnis augegeben werden oder auch alle Zahlen, die für das Ergebnis summiert wurden? Im zweiten Fall müsste dieser Code (und wohl auch der in den meisten anderen Antworten) um eine Kleinigkeit erweitert werden.
Müsste es nicht ++i sein bzw. alternativ i mit 1 initialisiert werden? Aber coole, kreative Lösung auf jeden Fall!
Hab es mal kompiliert und mit dem Ergebnis einer "herkömmlichen" Lösung veglichen. Scheint alles zu stimmen ... bin aber schon ziemlich müde, also alle Angaben ohne Gewähr. :)
Was ist denn das? Mit 'j%3' berechnest du j modulo 3, demnach ist das Ergebnis immer kleiner gleich 2, und dein Check 'j%3 < 99' immer wahr - klassische Endlosschleife. Außerdem addierst du immer nur eins zur Summe hinzu. Dabei sollst du dich die Summe der Zahlen bestimmten, die durch 3 teilbar sind, nicht ihre Anzahl. Hier etwas schlecht formatierter Beispielcode:
int Summe = 0;
int i = 0;
while(i<100){
if(j%3 == 0)
Summe += i;
}
Wieso? So kann ich nur entgegnen: Schlechter Kommentar.
Oh, bei dem Code ist aber einiges Schief gelaufen: natürlich muss es 'i%3 != 0' heißen, nicht j und ==. Und am Ende der Schleife muss noch ein i++ hin.
Das ist eigendlich sehr einfach.
While-Schleife:
int ergebnis = 0;
int j = 0;
while(j <= 99){
if(nichtDurchDrei(j)){
ergebnis = ergebnis + j;
}
j++;
}
System.out.println(ergebnis);
nichtDurchDrei-Methode:
public static boolean nichtDurchDrei(int j){
if(j%3==0){
return false;
}else{
return true;
}
}
Vielen Dank, Sie haben mir wirklich sehr geholfen <3
Ich hab da noch 2 kleine Fragen:
1.Was muss ich die Klammern schreiben bei " public static int nichtDurchDrei() ?
2.Was müsste dann in die Klammer bei System.out.println(nichtDurchDrei())?