wie zahlen von 1-99 addieren die nicht durch 3 teilbar sind(Informatik)?

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?

Woher ich das weiß:Studium / Ausbildung – Informatik-Studium / Mathematik-Studium / ITK-Ausbildung
IceyFlirty 
Fragesteller
 20.02.2018, 21:09

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())?

1
SirNik  20.02.2018, 22:40
@IceyFlirty

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

1
Deivil  20.02.2018, 21:48

zu 1. nichts muss in die Klammern, zu 2. der wert der variable summe muss ausgegeben werden, also: SystemyOut.Println(summe);

3

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

Kiboman  20.02.2018, 20:40

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++;

}

1

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. :)

Allw1553nd3r  20.02.2018, 22:13

Müsste es nicht ++i sein bzw. alternativ i mit 1 initialisiert werden? Aber coole, kreative Lösung auf jeden Fall!

2
TeeTier  20.02.2018, 22:39
@Allw1553nd3r

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. :)

1
Isendrak  15.03.2018, 14:23
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.

2

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;

}

Allw1553nd3r  20.02.2018, 21:09

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.

1

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;
   }
}