Primzahlen ausgeben



  • [code]#include <iostream>
    
    int main(){
        int num;
        std::cout << "Zahl: ";
        if( std::cin >> num && num > 1 ){    // 0 und 1 sind weder prim noch zusammengesetzt 
            for( int prime = 2; prime <= num; prime++ )
                 if(!( prime % 2 == 0 || prime % 3 == 0 || prime % 5 == 0|| prime % 7 == 0 ))
                       std::cout << prime << char(32);
        }
        std::cin.sync();
        std::cin.get();
        return 0;
    }
    

    [/code]

    Ist nicht sauber, da 2, 3, 5 und 7 (Primzahlen) nicht angezeigt werden aber ein ein bisschen basteln sollst du ja auch.



  • Gut...

    int i = 2; //für i == 1 brauchen wir ja nicht zu testen...
    bool isPrime = true; //prizipiell wird davon ausgegangen, dass wir eine Primzahl haben
    while ((i < zahl/2) && (isPrime)) //so lange testen, bis fest steht, dass es keine Primzahl ist und i kleiner, als die hälfte der Zahl ist - das könnte man auch noch optimieren, dass er nicht für jeden Durchlauf wieder zahl/2 rechnen muss etc - aber das macht wohl erst bei sehr großen Zahlen nen Unterschied - und überhaupt... ^^
    	{
    		if (zahl%i == 0) // -> i * n == zahl ==> lt. Def. keine Primzahl mehr (weil i ja hier niemals 1 oder die Zahl an sich sein kann)
    			isPrime = false;
    		else
    			++i; //alternativ auch i++ - ist hier egal, aber ich finde, man sollte sich das von Anfang an angewöhnen, so wenig wie möglich x++ zu nehmen...
    	}
    

    Das würde ich an deiner Stelle für das Testen auf eine Primzahl nehmen...
    Habs auch bissl kommentiert - hoffe, es ist ausreichend und entspricht deinen Vorstellungen ^^
    Deine erste Variante fand ich bissl komisch - sonst hätt ich sie genommen und verändert, aber naja :S

    bb ^^



  • Hm...

    also das ganze von unskilled kommt der geforderten Lösung die ich raushaben "soll" am nähesten, ist mir aber total unschlüssig. Wieso eigentlich zahl/2 und wieso ist es keine Primzahl wenn die zahl durch i geteilt keinen Rest hat? normalerweise müsste es doch gerade dann eine potentielle Primzahl sein, weil eine Primzahl ja ohne Rest teilbar sein muss?

    Bei meinem Code komme ich nicht weiter, ich bekomme einfach die Unterscheidung nicht hin ob es sich dabei wirklich um eine Zahl handelt die nur durch sich selbst (und 1) teilbar ist -.-

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int zahl=0;
    	int teiler=2;
    	bool isPrime;
    
    	cout << "Bitte geben Sie eine Zahl ein: " << endl; 
    	cin >> zahl;
    
    	while (teiler <=zahl) //check teiler gegen zahl
    	{
    		for (int test = 2; test < teiler; test++)
    
            if (teiler % test == 0)
                isPrime = false;
    
        	else
    		{
    			isPrime = true;
    		}
    
    		if (isPrime == true)
    		{
    			cout << teiler << " ";
    		}
    		teiler++; // hochzählen Teiler
    	}
    
    	system("PAUSE");
    
    	return 0;
    }
    


  • Ich weiss du willst Kommentare und Verbesserungsvorschläge zu DEINER Lösung (Das hast du ja schon deutlich gesagt.), aber mach dir doch trozdem mal die Mühe den untenstehenden Code nachzufolziehen.
    Der ist doch echt selbsterklärend und einfach.-Du testest einfach jede Zahl einzeln durch, was ist da noch unklar?

    #include <iostream>
    
    int main(void)
    {
    	std::cout<<"Grenzwert: ";
    	int grenzwert;
    	std::cin>>grenzwert; fflush(stdin);
    
    	//Jede Ganzzahl zwischen 2 und dem benutzerdefinierten Grenzwert koennte eine Primzahl sein,
    	//weshalb in der Folge jede durchgetestet wird.
    	for(int potenzielle_primzahl=2;potenzielle_primzahl<=grenzwert;potenzielle_primzahl++)
    	{
    		bool ist_primzahl=true;
    
    		//Ist die potenzielle Primzahl auch durch eine andere Zahl als 1 und sich selbst teilbar?
    		for(int teiler=2;teiler<=9;teiler++)
    		{
    			if(potenzielle_primzahl%teiler==0&&potenzielle_primzahl!=teiler)
    				ist_primzahl=false;
    		}
    
    		if(ist_primzahl==true)
    			std::cout<<potenzielle_primzahl<<std::endl;
    	}
    
    	std::cin.get();
    	return 0;
    }
    


  • Wozu ist denn der Quark mit dem Bool gut?
    Und warum 2 Schleifen ?

    Der Code den ich dir angeboten hab hat nur eine Schleife und 2 Variablen und keine unbekannten Funktionen (like fflush) 😉

    Nochmal vereinacht:

    #include <iostream>
    
    using namespace std;
    
    int main(){
        int num;
        cout << "Zahl: ";
        if( cin >> num && num > 1 ){    // 0 und 1 sind Sonderfälle, daher nur Zahlen > 1 zulassen
            for( int prime = 2; prime <= num; prime++ )   // von 2 zur eingegeben Zahl alle überprüfen 
                 if(!( prime % 2 == 0 || prime % 3 == 0 || prime % 5 == 0|| prime % 7 == 0 ))  
                       // es reicht die Zahl durch 2, 3, 5 und 7 zu teilen 
                       cout << prime << " ";
        }
        cout << endl;
        system("PAUSE");   
        return 0;
    }
    


  • Hm

    ich hab nun folgenden Code

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int zahl=0;
    
    	cout << "Bitte geben Sie eine Zahl ein: " << endl; 
    	cin >> zahl;
    
    	for (int teiler=2; teiler<=zahl; teiler++)
    	{
    		bool isPrime = true;
    
    		for (int teiler2=2; teiler2<=9; teiler2++)
    		{
    			if (teiler/teiler2==0 && teiler!=teiler2)
    			{
    				isPrime = false;
    			}
    		}
    
    		if (isPrime == true)
    		{
    			cout << teiler << " ";
    		}
    	}
    
    	system("PAUSE");
    
    	return 0;
    }
    

    Der Unterschlägt mir aber zum einen Alle Zahlen von 1-9 und gibt mir zweitens auch die zwölf aus, wenn ich als Zielzahl die 12 wähle ... es ist zum heulen



  • fflush(stdin) löscht den Eingabebuffer und somit das Enter welches von std::cin dort übrigbleibt.-Das macht dann std::cin.get() Probleme.
    Ich wollte nicht system("PAUSE") verwenden, weil ich mir nicht so sicher bin, ob das auch unter Linux hinhaut, denn PAUSE ist ja ein DOS-Befehl.

    Ausserdem: Gehört system(const char *command) eigentlich nicht zum C-Header stdlib?-Ein #include <cstdlib> täte evtl. ganz gut für den Stil, oder nicht?



  • @ThaRealMatix: Du dividierst einfach anstelle einer Modulodivision.



  • Null als Resultat einer Division macht ausserdem grundsätzlich keinen Sinn.



  • [qoute]Der Unterschlägt mir aber zum einen Alle Zahlen von 1-9 und gibt mir zweitens auch die zwölf aus, wenn ich als Zielzahl die 12 wähle ... es ist zum heulen[/quote]

    He Junge, was rauchst du?
    Wenn du keinen Bock hast Fragen zu anderen Codes zu stellen bzw. einfach mal zu probieren sie zu verstehen, was suchst du dann hier?

    if (teiler/teiler2==0 && teiler!=teiler2)
    da wirst du niemals 0 rausbekommen. Du musst ein "%" statt "/" setzen.

    Ausserdem musst du statt "&&" (und) ein "||" (oder) setzen, dann unterschlägt er dir auch nicht mehr die Zahlen von 1 - 9 wobei du nur von 1 - 7 überprüfen musst, denn 8 und 9 sind Vielfache von 2 und 3 ...



  • Pardon, ich meine 2 - 7



  • Also zum einen Rauche ich nichts zum anderen habe ich mir andere Codes angeschaut, danke -.-

    inzwischen hab ich viel rumprobiert und komme auf folgenden, funktionierenden Code

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int zahl=0;
    
    	cout << "Bitte geben Sie eine Zahl ein: " << endl;		//Einlesen der Zahl
    	cin >> zahl;											//Übergabe der Eingabe an Zahl
    
    	for (int teiler=2; teiler<=zahl; teiler++)				//Solange teiler kleiner/gleich zahl
    	{
    		bool isPrime = true;								// Annahme Prime ist immer gegeben
    
    		for (int teiler2=2; teiler2<teiler; teiler2++)		// Solange Teiler des Teilers kleiner
    		{													//Vorsicht KEIN <= benutzen!!! 
    			if (teiler%teiler2==0)							// Teilung des Teilers durch seinen Teiler
    			{												// ohne Rest bedeutet es ist keine Primzahl
    				isPrime = false;							
    			}
    		}
    
    		if (isPrime == true)
    		{
    			cout << teiler << " ";
    		}
    	}
    
    	cout << endl;
    
    	system("PAUSE");
    
    	return 0;
    }
    

    Das Problem ist, ich kam darauf durch probieren und vergleichen, nur wieso

    for (int teiler2=2; teiler2<teiler; teiler2++)		// Solange Teiler des Teilers kleiner
    		{													//Vorsicht KEIN <= benutzen!!! 
    			if (teiler%teiler2==0)							// Teilung des Teilers durch seinen Teiler
    			{												// ohne Rest bedeutet es ist keine Primzahl
    				isPrime = false;							
    			}
    		}
    

    den Teiler eben auf KEINE Primzahl stellt ist mir unklar... ich raff das einfach nicht.



  • sorry hat sich erledigt ich raffs jetzt endlich -.- schwere Geburt... sorry.



  • prime schrieb:

    wobei du nur von 1 - 7 überprüfen musst, denn 8 und 9 sind Vielfache von 2 und 3 ...

    Du hast offensichtlich nicht verstanden, was eine Primzahl ist.



  • "also das ganze von unskilled kommt der geforderten Lösung die ich raushaben "soll" am nähesten"
    Gut ^^

    "ist mir aber total unschlüssig"
    Ich hab doch extra alles kommentiert?!

    "Wieso eigentlich zahl/2"
    Schon mal nen Teiler gesehen, der größer ist, als die Hälfte der Zahl? a*b=c => c >= 2, b >= 2

    "und wieso ist es keine Primzahl wenn die zahl durch i geteilt keinen Rest hat?"
    omg... kein Rest => ist teilbar => ist keine Primzahl (da die ja nur durch sich selbst und 1 teilbar ist...)

    "potentielle Primzahl"
    Es gibt einfach ma keine potentiellen Primzahlen? Oder wann ist eine Zahl potentielle Primzahl? Oo Wenn sie ungerade ist? Oder erst, wenn die Quersumme nicht mehr durch 3 teilbar ist oder wann?

    "eine Primzahl ja ohne Rest teilbar sein muss?"
    Omg... Genau das macht eine Primzahl doch aus - das sie NICHT teilbar ist... xD

    "Bei meinem Code komme ich nicht weiter, ich bekomme einfach die Unterscheidung nicht hin ob es sich dabei wirklich um eine Zahl handelt die nur durch sich selbst (und 1) teilbar ist -.-"
    Ich hab dir deinen Code genau so umgeschrieben, dass es funtzt... GENAU so!!!

    Irgendwie weiß ich gerad nicht, ob du überhaupt ne Ahnung hast, von dem, was du machen willst: Primzahlen berechnen... Guck ma in der Definition in Wikipedia dazu nach...

    Ciao...

    //edit;
    "prime schrieb:
    wobei du nur von 1 - 7 überprüfen musst, denn 8 und 9 sind Vielfache von 2 und 3 ...

    Du hast offensichtlich nicht verstanden, was eine Primzahl ist. "

    Was daran falsch? Er muss eigtl nur 2-7 überprüfen (hat er ja au berichtigt) - aber ich kann da keinen Fehler finden : P Auf den Threadersteller hingegen trifft es 100pro zu...



  • Konrad Rudolph schrieb:

    prime schrieb:

    wobei du nur von 1 - 7 überprüfen musst, denn 8 und 9 sind Vielfache von 2 und 3 ...

    Du hast offensichtlich nicht verstanden, was eine Primzahl ist.

    Entweder bist du zu voreilig und hast den Nachpost nicht gelesen oder ich hab nicht verstanden was eine Primzahl ist.



  • prime schrieb:

    Konrad Rudolph schrieb:

    prime schrieb:

    wobei du nur von 1 - 7 überprüfen musst, denn 8 und 9 sind Vielfache von 2 und 3 ...

    Du hast offensichtlich nicht verstanden, was eine Primzahl ist.

    Entweder bist du zu voreilig und hast den Nachpost nicht gelesen oder ich hab nicht verstanden was eine Primzahl ist.

    Das Nachposting macht's nicht besser. Es reicht einfach nicht, die Zahlen 2–7 zu prüfen. Man muss jeden möglichen Teiler prüfen.

    Eine Primzahl ist ja als Zahl definiert, die nur durch sich selbst und durch 1 teilbar ist. Nach Deinem Code würde die Definition lauten „eine Zahl, die nicht durch die Zahlen 2–7 teilbar ist.“

    Und ich liefere auch gleich ein Gegenbeispiel: Dein Code würde ausgeben, dass 121 eine Primzahl ist, dabei ist 121 durch 11 teilbar.



  • ich hab auch mal so ein Programm geschrieben. Hier ist meine Version(hat zwar noch einige Bugs)

    #include <iostream>
    
    using namespace std;
    
    bool istPrimzahl(int zahl)
    {
         int i;
         float temp;
         for(i = 2; i<zahl-1; i++)
         {
               temp = zahl%i;
               if (temp == 0) return false;
         };
         return true;
    };
    
    int main(int argc, char *argv[])
    {
        int z, bis;
        bool test;
        cout << "Geben sie ein bis wohin sie die Primzahlen angezeickt bekommen wollen:" << endl;
        cin >> bis;
        z = 3;
        while(z!=bis)
        {
             test = istPrimzahl(z);
             if (test == true) cout << z << endl;
             z++;
        };
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Auch EXIT_SUCCESS ist in stdlib definiert.-Also "#include <cstdlib>".



  • Mein Code denn ich gestern gepostet habe, hat übrigens noch einen Fehler:

    for(int teiler=2;teiler<=grenzwert;teiler++)
    

    und nicht

    for(int teiler=2;teiler<=9;teiler++)
    

    Vollständig und richtig also:

    #include <iostream>
    
    int main(void)
    {
    	std::cout<<"Grenzwert: ";
    	int grenzwert;
    	std::cin>>grenzwert; fflush(stdin);
    
    	//Jede Ganzzahl zwischen 2 und dem benutzerdefinierten Grenzwert koennte eine Primzahl sein,
    	//weshalb in der Folge jede durchgetestet wird.
    	for(int potenzielle_primzahl=2;potenzielle_primzahl<=grenzwert;potenzielle_primzahl++)
    	{
    		bool ist_primzahl=true;
    
    		//Ist die potenzielle Primzahl auch durch eine andere Zahl als 1 und sich selbst teilbar?
    		for(int teiler=2;teiler<=grenzwert;teiler++)
    		{
    			if(potenzielle_primzahl%teiler==0&&potenzielle_primzahl!=teiler)
    				ist_primzahl=false;
    		}
    
    		if(ist_primzahl==true)
    			std::cout<<potenzielle_primzahl<<std::endl;
    	}
    
    	std::cin.get();
    }
    

Anmelden zum Antworten