Warum terminiert mein Programm nicht?

Nummer11

Mitglied
Hi,

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.
 

Anhänge

Java:
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
 
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


        }

    }
  }
 
Zuletzt bearbeitet:
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.
 
Wird teiler nicht nach dem sie Schleife beendet wurde wieder auf 2 zurückgesetzt?
Warum sollte denn teiler einfach so auf irgendeinen Wert gesetzt werden, ohne dass du die Anweisung hingeschrieben hast?

Und wenn ich doch einen neuen Kandidaten als zahl habe dann müsste sich doch die grenze ändern, oder wieso passiert das nicht?
Da das gleiche; warum sollte sich der Wert einfach ändern? Du musst schon hinschreiben, auf was die Variable gesetzt werden soll
 
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?
 

Zurück
Oben