Kain91 Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 Hallo,ich bin noch ziemlich unerfahren was Informatik angeht und habe diese Aufgaben vorgelegt bekommen: Schreiben sie ein Programm, dass eine vom Benutzer bestimmte Anzahl an Primzahlen ausgibt. So ... ich bin darauf zu diesemErgebnis gekommen, nur leider funktioniert es nicht. Erkennt vielleicht jemand den Fehler ? #include <stdio.h> int main(int argc, char* argv[]) { int zahl=2; int counter; int i=0; int isprim=1; int length; printf ("Bitte geben sie die Anzahl der Primzahlen ein:"); scanf ("%d", length); for (zahl=2; i<=length; zahl++) { isprim=1; for (counter=2 ;counter<zahl; counter++) { if (zahl%counter==0) isprim=0; } if(isprim==1) { printf ("Die Zahl %d ist eine Primzahl\n",zahl); counter=2; i++; } } return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 Die Berechnung der Primzahl ist an sich schon falsch, denn Du nimmst die Zahl Modulo Deines Zählers, damit wäre eine Primzahl nach Deinem Code eine Zahl die durch zahl-1 ohne Rest teilbar ist. Du solltest vielleicht einmal Wikipedia bemühen Sieb des Eratosthenes Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Leimy84 Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 1. mal verwendest du i und mal zahl in der ersten for schleife. 2. counter zurücksetzen ist nicht notwendig 3. i zu inkrementieren ist auch nicht nötig (selbst wenn es zahl wäre, da dies schon in der schleife geschieht ansonsten sollte der algorithmus funktionieren #include <stdio.h> int main(int argc, char* argv[]) { int zahl=2; int counter; int i=0; int isprim=1; int length; printf ("Bitte geben sie die Anzahl der Primzahlen ein:"); scanf ("%d", length); for (zahl=2; [B]zahl[/B]<=length; zahl++) { isprim=1; for (counter=2 ;counter<zahl; counter++) { if (zahl%counter==0) isprim=0; } if(isprim==1) { printf ("Die Zahl %d ist eine Primzahl\n",zahl); [B]//[/B]counter=2; [B]//[/B]i++; } } return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kain91 Geschrieben 29. Oktober 2011 Autor Teilen Geschrieben 29. Oktober 2011 Danke für die Antwort. Aber warum durch -1 der Counter zählt doch ab 2 aufwärts... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kain91 Geschrieben 29. Oktober 2011 Autor Teilen Geschrieben 29. Oktober 2011 (bearbeitet) Danke für die schnelles Antworten, also jetzt schmiert mir mein Compiler ab wenn ich den code kompilieren will. Seh ich das richtig dass ich die Variable i also gar nicht brauche? Aber ohne i zählt ja keine Variable mit, wieviele Primzahlen gefunden worden sind. Bearbeitet 29. Oktober 2011 von Kain91 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Leimy84 Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 (bearbeitet) achso ja dafür war i gut. #include <stdio.h> int main(int argc, char* argv[]) { int zahl; int counter; int i; int isprim=1; int length; printf ("Bitte geben sie die Anzahl der Primzahlen ein:"); scanf ("%d", length); for (i=0, zahl=2; i<length;zahl++) { isprim=1; for (counter=2 ;counter<zahl; counter++) { if (zahl%counter==0) {isprim=0;[B]break;[/B]} } if(isprim==1) { printf ("Die Zahl %d ist eine Primzahl\n",zahl); //counter=2; i++; } } return 0; } Das break verhindert das noch unnötig die Schleife durchlaufen wird obwohl schon klar ist, dass die Zahl keine Primzahl ist Der Compiler "schmiert ab"? Also stürzt ab oder bringt er einen Fehler? Bearbeitet 29. Oktober 2011 von Leimy84 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 Du solltest einen Booleantyp für Deine Variable "isprim" nehmen, denn Du hast genau 2 Zustände. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kain91 Geschrieben 29. Oktober 2011 Autor Teilen Geschrieben 29. Oktober 2011 So jetzt stürzt er nicht mehr ab aber ich hab das gleiche Problem wie zu Anfang. Der Zählt einfach zahl+=zahl hie rmal n Bild: http://s1.directupload.net/file/d/2692/dvzqa2cq_png.htm Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kain91 Geschrieben 29. Oktober 2011 Autor Teilen Geschrieben 29. Oktober 2011 Also mit Booleantyp meinste char ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 Also mit Booleantyp meinste char ? Boolean data type - Wikipedia, the free encyclopedia Char (Datentyp) Die Schleifen sind falsch. Der Algorithmus den Du zu implementieren versuchst ist das Sieb des Eratosthenes, d.h. Man beginnt mit 2, dann entfernt man alle Zahlen die ein Vielfaches von 2 sind, dann inkrementiert man die 2 zu 3, entfernt alle Vielfachen von 3, dann inkrementiert man 3 zu 4, da 4 ein Vielfaches von 2 ist, wird es direkt übersprungen und wieder inkrementiert zu 5. Dein Algorithmus wird in dieser Form nicht funktionieren ! Es ist durchaus hilfreich, wenn Du Dir den Wikipediaartikel anschauen würdest Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kain91 Geschrieben 29. Oktober 2011 Autor Teilen Geschrieben 29. Oktober 2011 Ich kenn den Algorithmus von dem Eratosthenes, das problem ist wenn ich den anwende muss ich Felder erzeugen und mein Lehrer meinte das muss auch ohne Felder gehen. Deswegen hab ichs so versucht. Aber gut dann werd ich nochmal von vorne beginnen xD danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 (bearbeitet) Du kannst erst am Ende des Algorithmus, d.h. wenn alle Zahlen in Deinem Intervall geprüft wurden entscheiden, ob eine Zahl prim ist oder nicht. Während der Iterationen kannst Du höchstens entscheiden, dass eine Zahl kein Vielfaches von einer anderen ist bzw. kein Vielfaches von einer Zahl von 2 bis n (n aktuelle Zahl). Die Definition einer Primzahl ist, dass sie nur durch 1 und nur durch sich selbst ohne Rest teilbar ist, d.h. wenn Du entscheiden willst, ob eine Zahl prim ist, dann musst Du _alle_ Zahlen von 2 bis n-1 prüfen, ob n durch eine dieser teilbar ist (verkürzt gesagt), daraus folgt aber dass das "alle" der wichtigste Punkt ist, in Deiner bisherigen Lösung betrachtest Du nur eine Restklasse (Kongruenz (Zahlentheorie)) Die Aussage, dass man dazu ein Feld braucht, ist nicht ganz korrekt. Man braucht nicht zwingend ein Feld, man kann das auch etwas dynamischer gestalten. Vor allem lohnt es sich, den Algorithmus von Eratosthenes etwas zu modifizieren, dass man schon während der Iteration der äußeren Schleife sagen kann, ob Primzahlen vorliegen, denn wenn man das Intervall [2, k) und [k,n] betrachtet, dann kann immer aussagen, welche Zahlen im Intervall [2,k) prim sind, d.h. man kennt alle Primzahlen bis zur aktuellen Position. Bearbeitet 29. Oktober 2011 von flashpixx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Leimy84 Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 So jetzt stürzt er nicht mehr ab aber ich hab das gleiche Problem wie zu Anfang. Der Zählt einfach zahl+=zahl hie rmal n Bild: Directupload.net - Ddvzqa2cq.png Was ist denn an dem Bild falsch? Das sind Primzahlen! Aber was hast du denn als Primzahlmenge eingeben wenn ich fragen darf. Also ich hab mal 15000 angegeben und kam nicht so hoch. @flashpixx: Die Verwendung eines anderen Algorithmusses ist sicherlich nicht verkehrt, aber für einen Programmieranfänger nicht realisierbar. Es geht in diesem Thread doch auch nicht darum, das Ganze zu optimieren, sondern es einfach nur zu lösen. Die im ersten Post angewandte Technik ist absolut in Ordnung. Ich bin mir auch grade nicht so sicher, warum der TE daran zweifelt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Leimy84 Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 (bearbeitet) Ich habs jetzt auchmal in c umgesetzt und dann wurde mir klar was falsch war: scanf ("%d", &length); scanf erfordert die Übergabe eines Zeigers. Jetzt nur noch das <= durch ein < ersetzten und alles läuft: for (zahl=2; i<length; zahl++) Bearbeitet 29. Oktober 2011 von Leimy84 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kain91 Geschrieben 29. Oktober 2011 Autor Teilen Geschrieben 29. Oktober 2011 Ahhh .. was für ein blöder Fehle. Danke für eure Mühen und den Aufwand den ihr betrieben habt. War grad echt schon am verzweifeln... aberjetzt funktionierts xD Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 29. Oktober 2011 Teilen Geschrieben 29. Oktober 2011 Einmal eine C++ Variante auf die schnelle codiert: #include <cstdlib> #include <iostream> #include <vector> int main(int argc, char* argv[]) { std::size_t l_max = 0; std::cout << "Zahl eingeben (Maximum) : "; std::cin >> l_max; std::cout << std::endl; std::vector<std::size_t> l_prims; for(std::size_t i=2; i <= l_max; ++i) l_prims.push_back(i); for(std::size_t n=0; n < l_prims.size(); ++n) for(std::size_t i=n+1; i < l_prims.size(); ++i) if (!(l_prims[i] % l_prims[n])) l_prims.erase(l_prims.begin()+i); std::cout << "Primzahlen von [0," << l_max << "] : "; for(std::size_t i=0; i < l_prims.size(); ++i) std::cout << l_prims[i] << " "; std::cout << std::endl; return EXIT_SUCCESS; } Der Algorithmus ist immer noch der gleiche, letztendlich ist nur die Struktur invertiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Leimy84 Geschrieben 30. Oktober 2011 Teilen Geschrieben 30. Oktober 2011 Nein, er gibt die Primzahlen zwischen 2 und x aus, gesucht waren aber die ersten x Primzahlen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.