Primzahlendarstellung < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Aufgabe | [Dateianhang nicht öffentlich] |
Ich weiß, dass dieser Algorithmus nun die Primzahl ausgeben wird.
Meine Frage ist jetzt inwiefern die Zahl(en) ausgegeben werden muss (müssen).
Ist aus dem array wirklich eine Zahlenfolge zu entnehmen?
Und wie stellt man das ganze (wie in der Aufgabenstellung) in C++ dar?
Mein Ansatz:
1: |
| 2: | #include <iostream>
| 3: | using namespace std;
| 4: |
| 5: |
| 6: | int main (){
| 7: |
| 8: |
| 9: | cout << "Geben Sie eine natuerliche Zahl ein: ";
| 10: | int n = 0;
| 11: | cin >> n;
| 12: |
| 13: | int is_prime(n);
| 14: | is_prime=true;
| 15: |
| 16: |
| 17: |
| 18: | int i=2;
| 19: | while (i<n){
| 20: | if (is_prime (i) == true){
| 21: | int k=2;
| 22: | while (k*i<n)
| 23: | {is_prime (k*i) = false;
| 24: | k++;
| 25: | }}
| 26: | i++;
| 27: | }
| 28: |
| 29: | cout << "Array " << "=>" << is_prime (n) << "\n";
| 30: | return 0;
| 31: | }
|
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Leider funktioniert das nicht so wie ich es mir vorgestellt hab.
Bitte somit um Hilfe.
Danke im Voraus.
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:28 Sa 03.11.2007 | Autor: | Infinit |
Hallo Fibonacci,
das Array beinhaltet nur eine logische Variable, ob der Wert an der n-ten Stelle (und damit die Integerzahl n) eine Primzahl ist oder nicht. Du initiierst jedoch dieses Feld als Integer-Feld und vergleicht es mit einer logischen Variablen, was kaum hinhauen dürfte, wenn man an der Ausgabe von Primzahlen interessiert ist. Dies wird jedoch, zu meinem Wundern, in der Aufgabe gar nicht verlangt, man soll nur das Feld zurückgeben als Ergebnis des Vergleiches. Wenn man an den Primzahlen bis zur Zahl n interessiert ist, und davon gehe ich mal aus, müsste man den Index derjenigen Feldelemente ausgeben, die "true" sind.
Viele Grüße,
Infinit
|
|
|
|
|
Weißt du wie sich das im C++ darstellen lässt?
Hab alle Kombis schon fast durchgearbeitet und da kommt nur Unsinn raus :(
|
|
|
|
|
Hallo,
> Hab alle Kombis schon fast durchgearbeitet und da kommt nur Unsinn raus :(
Dann hattest du diese Kombi wohl noch nicht:
1: | #include <iostream>
| 2: |
| 3: | int main (int argc, char* argv[])
| 4: | {
| 5: | int i, k, n;
| 6: | bool* is_prime;
| 7: |
| 8: | if (argc > 1)
| 9: | n = atoi(argv[1]);
| 10: | else
| 11: | {
| 12: | std::cout << "Geben Sie eine natuerliche Zahl ein: ";
| 13: | std::cin >> n;
| 14: | }
| 15: |
| 16: | is_prime = reinterpret_cast<bool*>(malloc(n*sizeof(bool)));
| 17: | is_prime[0] = false;
| 18: | is_prime[1] = false;
| 19: | for (i=2; i<n; ++i) is_prime[i] = true;
| 20: |
| 21: | for (i=2; i<n; ++i)
| 22: | if (is_prime[i])
| 23: | for (k=2; k*i<n; ++k)
| 24: | is_prime[k*i] = false;
| 25: |
| 26: | std::cout << "\nDie Primzahlen unter " << n << ": \n";
| 27: | for (i=1; i<n; ++i)
| 28: | if (is_prime[i])
| 29: | std::cout << i << '\t';
| 30: |
| 31: | std::cout << "\n\nDas Sieb-Array ab 1: \n";
| 32: | for (i=1; i<n; ++i)
| 33: | std::cout << is_prime[i] << '\t';
| 34: |
| 35: | free(is_prime);
| 36: | } |
Gruß
Martin
|
|
|
|
|
Nun das ist eine Kombi, die allerdings nicht aus der Aufgabenstellung hervorgeht!
Da sind Befehle, die überflüssig sind!
es sollte schon bei
bleiben!
Am besten eine Struktur aus der Aufgabenstellung entwickeln.
Die Befehle hatten wir zum größten Teil noch nicht also wird das wohl nicht die Lösung sein.
Alternativ werde ich es zwar verwenden aber suche trotzdem noch die "einfachere" Lösung.
|
|
|
|
|
Hallo,
dabei fand ich meine Lösung eleganter, aber den Einwand verstehe ich.
Das int main() hatte ich nur ersetzt, damit man das n direkt beim Aufruf übergeben kann (und nur notfalls per cin). OK, ist weg.
Vermutlich war auch das malloc nicht erlaubt. Daher habe ich nun ein statisches bool-Array. Hier muss aber vorher (zur Kompilierzeit) das maximale n - hier durch die Konstante MAX_N festegelegt werden. Die kannst du natürlich ändern, nur eben vor dem Kompilieren. Ist halt ineffizient.
> Am besten eine Struktur aus der Aufgabenstellung entwickeln.
Ja, habe ich auch. Aber ein bisschen "Drumherum" muss es schon geben.
Außerdem würde ich überall, wo ich die Anzahl der Durchläufe schon kenne, for- anstelle von while-Schleifen benutzen. Da muss ich mich nicht um die Auswertung der Bedingung kümmern.
> Die Befehle hatten wir zum größten Teil noch nicht also wird das wohl nicht die Lösung sein.
"Die Lösung" gibt es natürlich nicht. Aber ich denke, wenn man malloc und das main(...) weglässt, dann ist alles im Grünen Bereich, oder?
Vielleicht so:
1: | #include <iostream>
| 2: |
| 3: | int main (int argc, char* argv[])
| 4: | {
| 5: | const int MAX_N = 1000;
| 6: | int i, k, n;
| 7: | bool is_prime[MAX_N];
| 8: |
| 9: | std::cout << "Geben Sie eine natuerliche Zahl ein: ";
| 10: | std::cin >> n;
| 11: | if (n > MAX_N)
| 12: | {
| 13: | std::cout << n << " ist groesser als " << MAX_N << ". Abbruch!\n";
| 14: | exit(-1);
| 15: | }
| 16: |
| 17: | is_prime[0] = false;
| 18: | is_prime[1] = false;
| 19: | for (i=2; i<n; ++i)
| 20: | is_prime[i] = true;
| 21: |
| 22: | for (i=2; i<n; ++i)
| 23: | if (is_prime[i])
| 24: | for (k=2; k*i<n; ++k)
| 25: | is_prime[k*i] = false;
| 26: |
| 27: | std::cout << "\nDie Primzahlen unter " << n << ": \n";
| 28: | for (i=1; i<n; ++i)
| 29: | if (is_prime[i])
| 30: | std::cout << i << '\t';
| 31: |
| 32: | std::cout << "\n\nDas Sieb-Array ab 1: \n";
| 33: | for (i=1; i<n; ++i)
| 34: | std::cout << is_prime[i] << '\t';
| 35: | } |
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:55 So 04.11.2007 | Autor: | Fibonacci- |
Vielen Dank :)
ich versuche noch ein bisschen "rumzubasteln".
Du hast mir auf jeden Fall weitergeholfen.
Nochmals Danke.
|
|
|
|