Einfaches Programm zur Ausgabe der Primzahlen bis 1000



  • Hallo,
    ich bin gerade dabei ein kleines Programm zuschreiben, dass die Primzahlen bis 1000 ausgeben soll.

    Es tut allerdings nicht das was es soll, sondern gibt nur zweimal die Zahl 2 aus. Könnt ihr mir sagen, wo der Fehler steckt, ich habe wohl gerade ein Brett vor dem Kopf ](*,)

    #include <iostream>
    using namespace std;
    
    int main()
    {
    int teiler;
    int zahl;
    
    cout<<"Dies sind alle Primzahlen von 1 bis 1000"<<endl<<endl;
    
    for (zahl=2;zahl<=1000;zahl++)
    {
        for (teiler=1;1<=zahl-1;teiler++)
        {
        if (zahl%teiler==0) cout<<zahl<<endl;
        }
    }
    }
    

    Danke
    jawo3



    1<=zahl-1
    

    Was soll das hier bringen?

    Überleg dir nochmal wann eine Zahl eine Primzahl ist.



  • Damit wollte ich sagen, dass der Teiler maximal so groß sein darf wie die Zahl minus eins weil alle alle Zahlen die größer sind ja nicht getestet werden brauchen.

    ...ich weiß aber nicht wo ich den Fehler gemacht habe.

    Könntest du mir einen kleinen Denkanstoß geben?

    Vielen Dank
    jawo3



  • Oh ich sehe gerade das muss natürlich so aussehen:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    int teiler;
    int zahl;
    
    cout<<"Dies sind alle Primzahlen von 1 bis 1000"<<endl<<endl;
    
    for (zahl=2;zahl<=1000;zahl++)
    {
        for (teiler=1;teiler<=zahl-1;teiler++)
        {
        if (zahl%teiler==0) cout<<zahl<<endl;
        }
    }
    }
    

    Das was es soll tut es aber trotzdem nicht...

    Jetzt gibt das Programm die Zahlen jeweils 15 mal die Zahlen von 960 bis 1000 aus 😕



  • ich habe vor einigen monaten mal eins gemacht:

    int _tmain()
    {
    	int i = 0;
    	int k = 0;
    	int startzahl = 0;
    	int endzahl = 0;
    	int modzaehler = 0;
    	cout << "P R I M Z A H L E N" << endl << "====================" << endl << endl;
    
    	cout << "Startzahl: ";
    	cin >> startzahl;
    	cout << "Endzahl: ";
    	cin >> endzahl;
    	cout << endl;
    	for (i=startzahl; i<endzahl; i++)
    	{
    		for (k=1; k<i/2+1; k++)			
    		{
    			if(i%k==0) modzaehler++;
                if(modzaehler>1) break;  //Wenn einen Teiler gibt, sofort aus der Schleife aussteigen
    		};
    
    		if (modzaehler==1||i==1)
    		{
    			printf("\n%i\n", i);
    		};
    		modzaehler = 0;
    	};
    	return 0;
    }
    


  • Ich werde hier noch wahnissnig...

    Ich bekomme es einfach nicht selbst hin. Bei all meinen Lösungansätzen falle ich früher oder später wieder auf meinen vom Anfang zurück.

    Könntest du mir mein Programm von oben bitte umwandeln, so dass es funktioniert, aber nicht zu sehr verändert wird und ich es noch nachvollziehen kann?
    Daraus kann ich ja eigentlich auch nur lernen, wenn ich das Programm dann sehe, verstehe und nochvollziehen kann, kann ich endlich in meinem Tutorial, das ich derzeit lese weitermachen...



  • Ungetestet:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    int teiler;
    int zahl;
    
    cout<<"Dies sind alle Primzahlen von 1 bis 1000"<<endl<<endl;
    
    for (zahl=2;zahl<=1000;++zahl)
    {
    bool prim = true;
        for (teiler=2;prim && teiler<=(zahl+1)/2;++teiler)
        {
        if (zahl%teiler==0) prim=false;
        }
    if(prim)
    cout<<zahl<<endl;
    }
    }
    

    Er schreibt dir jede Zahl so oft auf, wie er Teiler gefunden hat...
    EDIT: und natürlich einmal mehr, da jede Zahl durch 1 teilbar ist => teiler=2...



  • Ja, das Prog von dir läuft...

    Jetzt muss ich mich da erstmal reindenken...



  • #include <iostream>
    
    int main()
    {
    	std::cout << "Primzahlen von 0001 bis 1000\n" << std::endl;
    	std::cout << 2 << std::endl;
    	for (unsigned long prim = 3; prim <= 1000; prim += 2) // von 3 bis 999 in 2er-Schritten hochzählen
    		for (std::size_t div = 1; div < prim; div += 2) // von 1 bis evtl. Primzahl - 1 in 2er-Schritten hochzählen.
    			if (prim % div == 0)	// Beim 1. Durchlauf: evtl. Primzahl durch 1 restlos teilbar?	
    									// Beim 2. Durchlauf: evtl. Primzahl durch 3 restlos teilbar? usw.
    				// Wenn 1. Durchlauf true: ausgeben. Dann beim 2. Durchlauf wieder. (d.h. auch die Ausgabe "2" und "2" ...)
    				std::cout << prim << std::endl;
    
    }
    

    So mal deinen Code kommentiert ... einmal hattest du nen Tippfehler drin: die 2. for-Schleife ... als Abbruchbedingung hattest du eine konstant wahre Bedingung angegeben. 1 durch teiler ersetzen 😛
    Dann ist natürlich dein Vergleich ob prim restlos durch div teilbar ist nicht soo korrekt. Wenn es eine Primzahl wäre, dürfte da NICHT 0 rauskommen. Wenn es keine ist, dann schon 😛



  • @(D)Evil

    Der Code den du gepostest hast, läuft nicht, da werden auch Zahlen wie 25 ausgegeben und alle Zahlen mehrfach...

    Und warum benutz du nicht using namespace std;?
    Ist doch umständlich, oder?



  • @(D)Evil

    Der Code den du gepostest hast, läuft nicht, da werden auch Zahlen wie 25 ausgegeben und alle Zahlen mehrfach...

    Und warum benutz du nicht using namespace std;?
    Ist doch umständlich, oder?

    @Cpp-Anfänger
    Könntest du bitte die zweite Vorschleife genau erklären, ich verstehe die irgendwie nicht...



  • @jawo3: Ist ja auch deiner! Mein Gott du sollst den Code nicht einfach kopieren sondern lesen was man dazu schreibt. Da steht genau drin wo der Fehler liegt usw.

    @Topic: Das Thema hatten wir vor 2 Tagen das letzte mal. WARUM benutzt ihr nicht einfach mal den scheiß "Suchen"-Button?



  • @jawo3: Ist ja auch deiner! Mein Gott du sollst den Code nicht einfach kopieren sondern lesen was man dazu schreibt. Da steht genau drin wo der Fehler liegt usw.

    Dann hättest du doch direkt meinen nehmen können und den dann kommentieren, dann hätte ich es sicherlich besser verstanden als wenn du da noch soviele Sachen abänderst...

    @Topic: Das Thema hatten wir vor 2 Tagen das letzte mal. WARUM benutzt ihr nicht einfach mal den scheiß "Suchen"-Button?

    Weil ich es gerade nicht einfach kopieren möchte, sondern weil ich es verstehen möchte. Folglich muss ich ja wohl erstmal selber ein Programm schreiben über dieses nachdenken und versuchen den Fehler zu finden. Ich habe ihn aber leider nicht gefunden also habe ich dieses Forum zu Rate gezogen um mir hier Hilfe zu holen. Ich wollte ja nicht mit einem völlig fremden Code arbeiten dessen Ersteller einen möglicherweise ganz anderen Programmierstil hat...



  • Hallo jawo3,

    sorry, dass ich erst jetzt antworte:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    int teiler;
    int zahl;
    
    cout<<"Dies sind alle Primzahlen von 1 bis 1000"<<endl<<endl;
    
    for (zahl=2;zahl<=1000;++zahl){
    bool prim = true; // Jede Zahl ist eine Primzahl bis nen Teiler gefunden wurde
        for (teiler=2; prim && teiler<=(zahl+1)/2;++teiler)
    // Hier geht man alle ganzen Zahlen bis zur Hälfte den eigentlichen Wert durch
    // (eigentlich würde sogar die Wurzel reichen)
    // Wenn eine Zahl einen Teiler hat, muss sie nicht weiter getestet werden
    // ++teiler statt teiler++, da Preincreament keine Kopie erzeugt, würde bei
    // einfachen Datentypen eh wegoptimiert (Performance)
        {
        if (zahl%teiler==0) prim=false;
    // Überprünfung des aktuellen Teilers
        }
    if(prim)
    cout<<zahl<<endl;
    }
    }
    

    Gruß,
    *Cpp-Anfänger*



  • Hiho Freunde der Sonne^^,

    ich bin neu hier und finde dieses Forum Klasse^^
    werdet bestimmt noch oft von mir hören 😃 wegen Problemen die wohl jetzt dann auf mich zukommen^^

    Ok aba nun zum Thema

    Hier ist dein Code nur so abgeändert das es laufen müsste.
    Ich habe nur das was ich geändert hab versucht zu erklären hoffe das es hilft^^

    Dein eigentlicher Fehler lag wie schon von anderen gesagt einfach darin das du wenn die Zahl einen Teiler hat ausgeben wolltest^^ es ja aber eig andersrum sein sollte^^

    #include <iostream.h>
    #include <windows.h> 
    
    int main() 
    { 
    int teiler; 
    int zahl; 
    bool b_keineprim=false;					//Prüfvariable ob die Zahl einen Teiler hat
    cout<<"Dies sind alle Primzahlen von 1 bis 1000"<<endl<<endl; 
    
    for (zahl=2;zahl<=1000;zahl++) 
    { 
        for (teiler=2;teiler<zahl/2;teiler++)	//eigentlich brauchst du nur alle  Zahlen prüfen
        {				         // die kleiner als die hälfte der eigentlichen zahl sind (performance)
    		if (zahl%teiler==0)        //wie schon erwähnt merkst du dir einfach ob diese Zahl einen Teiler hat
    		{
    			b_keineprim=true;
    			break; 
    		}
    	}
    	if (b_keineprim==false)					//und wenn nicht
    	{
    	cout<<zahl<<endl;					//ausgeben
    	}else
    	{
    	b_keineprim=false;			//wenn schon prüfvariable wieder auf false setzen
    	}
    } 
    
    return 0;
    }
    

    hoffe es passt so^^

    greetz da sand13r

    PS. nochmals.. klasse Forum^^

    EDIT: *oh man*..

    man sollte schon ein Forum bedienen können sollte man meinen..sry war ja schon lang beantwortet -.-


Anmelden zum Antworten