Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe ein Programm geschrieben, was die ersten 100 Primzahlen ausgeben soll. Bzw. sollte ich besser sagen, dass ich es versucht habe zu schreiben. Ich hab nämlich das Problem, dass es nicht terminiert und ich weiss nicht warum... Ich hoffe jemand hier kann mit weiterhelfen.
PS: Ich habe bereits eine Lösung zu der Aufgabe, jedoch ist der Ansatz ein etwas anders. Deswegen versuche ich das auf "meine Weise" zu machen.
int zahl = 1;
int grenze = zahl / 2;
int teiler = 2;
int rest;
int y = 0;
while (y != 100) {
while (teiler <= grenze) {
rest = zahl % teiler;
teiler++;
if (rest != 0 && teiler == grenze) {
System.out.print(zahl);
y++;
}
}
zahl++; // das zahl++; befindet sich nicht mehr in der inneren while schleife
}
Dein teiler ist 2 und deine grenze ist 0, daher gilt niemals, dass teiler <= grenze , y kann also niemals erhöht werden
@Meniskusschaden Ich wusste nicht dass das geht. Nächstes mal versuch ich das so so posten, wie du gesagt hast.
@Meniskusschaden@mrBrown Dann müsste der Code aber theoretisch funktionieren, wenn ich z.B "zahl=13" definiere, oder nicht? Dann wäre ja "teiler" kleiner als "grenze". Er funktioniert aber auch dann nicht.
Dann müsste der Code aber theoretisch funktionieren, wenn ich z.B "zahl=13" definiere, oder nicht? Dann wäre ja "teiler" kleiner als "grenze". Er funktioniert aber auch dann nicht.
In dem Fall gilt irgendwann teiler==7 und grenze==6 und die innere Schleife wird nicht mehr betreten. Das Inkrementieren von zahl in der äußeren Schleife ändert daran nichts, weil es weder Einfluß auf teiler noch auf grenze hat.
Aber die innere Schleife soll ja dann auch nicht mehr ausgeführt werden, wenn der teiler größer als grenze ist. Dann hat man ja alle Teiler geprüft und wenn bis dahin kein mal die if-Bedingung erfüllt war, haben wir keine Primzahl.
So verstehe ich den Code. :/
Mir ist noch etwas aufgefallen, was ich jetzt geändert habe. Nämlich für den Fall, dass rest=0 ist kann man direkt zur nächsten Zahl, da es dann sicherlich keine Primzahl mehr ist.
Das löst aber leider immer noch nicht mein Problem. Kannst du mir vllt nen Tipp geben, was ich ändern könnte?
Ich weiß ehrlich gesagt garnicht ob der Ansatz den ich hab ganz gut ist oder ob ich komplett auf dem Holzweg bin. :/
Java:
public class Ausgabe {
public static void main(String[] args) {
int zahl =1;
int grenze = zahl / 2;
int teiler = 2;
int rest;
int y = 0;
while (y!=100){
while (teiler <= grenze) {
rest = zahl % teiler;
teiler++;
if ( rest!=0 && teiler == grenze) {
System.out.print(zahl);
y++;}
else {
if (rest==0) {
zahl++;
}
}
}zahl++; // das zahl++; befindet sich nicht mehr in der inneren while schleife
}
}
}
Aber die innere Schleife soll ja dann auch nicht mehr ausgeführt werden, wenn der teiler größer als grenze ist. Dann hat man ja alle Teiler geprüft und wenn bis dahin kein mal die if-Bedingung erfüllt war, haben wir keine Primzahl.
So verstehe ich den Code. :/
Das wurde dann für den ersten Primzahl-Kandidaten geprüft. Dann soll in der äußeren Schleife der nächste Kandidat festgelegt werden, für den in der inneren Schleife dann erneut geprüft werden soll, ob er eine Primzahl ist.
Das wurde dann für den ersten Primzahl-Kandidaten geprüft. Dann soll in der äußeren Schleife der nächste Kandidat festgelegt werden, für den in der inneren Schleife dann erneut geprüft werden soll, ob er eine Primzahl ist.
Wieso das denn nicht?
Wird teiler nicht nach dem sie Schleife beendet wurde wieder auf 2 zurückgesetzt?
Und wenn ich doch einen neuen Kandidaten als zahl habe dann müsste sich doch die grenze ändern, oder wieso passiert das nicht?
Ich weiß auch nicht warum, aber ich dachte das wäre so. Wieder was gelernt, danke. Hab das jetzt so gemacht:
Java:
public class Ausgabe {
public static void main(String[] args) {
int zahl =1;
int grenze;
int teiler;
int rest;
int y = 0;
while (y!=100){
teiler =2;
grenze = zahl/2;
while (teiler <= grenze) {
rest = zahl % teiler;
teiler++;
if ( rest!=0 && teiler == grenze) {
System.out.print(zahl + " ");
y++;}
else {
if (rest==0) {
zahl++;
}
}
} zahl++;
} // das zahl++; befindet sich nicht mehr in der inneren while schleife
}
}
Das gute ist: Ich lande nicht mehr in einer Endlosschleife!
Nicht so gut: Der Code spuckt irgendwie Mist aus. Stimmt das denn so, wie ich es umgeschrieben habe?
Ich merk grade auch, dass das iwie fehl am Platz ist. Der Gedanke war, dass ich direkt zur nächsten Zahl gehen kann, wenn eine Zahl durch 2 teilbar ist. Aber ich habe das jetzt wieder gelöscht.