Wir sollen im Unterricht eine Schleife erstellen, die alle Primzahlen bis 100 ausgibt, jedoch sitzen wir seid mehreren Stunden dran und kriegen es nicht hin?

4 Antworten

Die Variable limit außen zu definieren macht Sinn. Die Variable zahl kann auch in dem for-Statement definiert werden. Die Variable prim ist unnötig. Sobald ein Teiler gefunden wurde, kann die innere Schleife abgebrochen werden. Bei deiner Lösung wird die Zahl (auch zusammengesetzte Zahlen) jeden Durchlauf ausgegeben, bis ein Teiler gefunden wird. Die Zahl sollte aber erst nach dem gesamten Durchlauf der inneren Schleife ausgegeben werden, falls kein Teiler gefunden wurde. Außerdem wird die Variable counter nach einem Schleifendurchlauf bei dir nicht mehr zurückgesetzt.

Meine Lösung:

  public class Main{
      public static void main(String[] args) {
          int limit = 100;
          test:for (int zahl = 2; zahl <= limit; zahl++) {
              for(int counter = 2; counter <= Math.sqrt(zahl); counter++) {
                  if (zahl % counter == 0)
                      continue test;
              }
              System.out.println(zahl);
          }
      }
  }

Mit while-Schleifen:

public class Main{
    public static void main(String[] args) {
        int limit = 100;
        int zahl = 1;
        test:while (++zahl <= limit) {
            int counter = 1;
            while(++counter <= Math.sqrt(zahl)) {
                if (zahl % counter == 0)
                    continue test;
            }
            System.out.println(zahl);
        }
    }
}

Nxls103 
Beitragsersteller
 24.01.2023, 13:52

Also erstmal danke, das hat mir schon sehr geholfen. Meine Frage dazu wofür brauche ich das test:while? muss das mit rein oder kann man das weglassen. Verstehe nicht wofür das benötigt wird.

Mathmaninoff, UserMod Light  24.01.2023, 13:58
@Nxls103

Das ist ein label und bewirkt, dass beim continue die äußere Schleife fortgesetzt wird, also die Ausgabe übersprungen wird. Ansonsten müsste man vor der Ausgabe überprüfen, ob die innere Schleife beendet wurde, weil man die Wurzel erreicht hat oder ob man auf einen Teiler gestoßen ist.

Das ist doch fast fertig.

Die Ausgabe "ist prim" gehört hinter die While-Schleife.


Schachpapa  24.01.2023, 13:10

und der counter (besser teilerKandidat oder faktor) muss für jede Zahl neu gesetzt werden.

public class Main {
  public static void main(String[] args) {
   int i = 2;
   boolean prime = true;
   while (i < 100){
   for (int j = 2; j < i-1; j++){
    if (i%j == 0) prime = false;
   }
   if (prime){ 
    System.out.println(i);
   } else{
    prime = true;
   }
   i++;
   }
  }
}
Woher ich das weiß:Berufserfahrung

verreisterNutzer  24.01.2023, 13:11

Falls wirklich alles mit While-Schleifen gemacht werden soll, musst du die for-Schleife noch durch das hier ersetzen:

int j = 2;
while (j < i-1){
  if (i%j == 0) prime = false;
  j++;
}

Wenn du mit der Wurzel arbeitest, wendest du bereits einen Verfeinerungsschritt an.

Die einfachste Variante ist

for(i=2;i<=100;i++){
  prim = true
  for(j=2;j<i;j++)
    if(i%j==0)
      prim = false;
  Ausgabe(<i ist prim: prim.toString()>); 
}

Wenn du das soweit hast, kannst du anfangen, zu optimieren. So würde ich das angehen. Also erstmal eine Basis schaffen und diese dann ausbauen.

Woher ich das weiß:Studium / Ausbildung – Fachinformatiker - Anwendungsentwicklung