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?
Wir sollen das ganze in While schleifen schreiben, doch haben keinen blassen Schimmer wie dieses gehen soll.
Das haben wir bisher.
public class Main {
public static void main(String[] args) {
int limit = 100;
int zahl; //überprüfen der zahl
int counter= 2;
boolean prim; //Hilfsvariable ob die aktuelle zahl eine Primzahl ist
for (zahl = 2; zahl <= limit; zahl++) {
prim = true;
while(counter < Math.sqrt(zahl) + 1) {
counter++;
if (zahl % counter == 0) {
prim = false;
} else if (prim) {
System.out.println(zahl + " ");
}
}
}
}
}
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);
}
}
}
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.
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++;
}
}
}
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.
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.