Sieb des Eratosthenes



  • Hi,

    ich habe mich versucht das Sieb des Eratosthenes in C++ zu schreiben. Dabei hab ich eine der gängigen Einleitungen verfolgt. Da ich in C++ noch nicht firm bin (wirklich erster Versuch), poste ich den Quelltext hier hin, da ich schon glaube, daß syntaxmäßig einige bugs enthalten sind.

    #include <iostream>

    using namespace std;

    int main ()
    {
    int size;
    int array [] = new [size+1];

    for (int i= 0; i< size+1 ; i++)
    array[i]= 1;

    int boundary= srqt(size);

    for (j=2; j < boundary; j++)
    {
    for (n=1; n<(int) (boundary/ j); n++)
    {
    array[j*n]= 0;
    }
    }

    int counter= 0;

    for (int i= 0; i< size+1 ; i++)
    {
    if (array[i] == 1)
    counter++;
    }
    }

    Die offenen Fragen sind: Ist das array richtig iinitialisiert? Irgendwo muß es doch schon eine Bibliotheksfunktion zum Wurzelziehen geben, nur wo? Benutze Microsoft 😮 Visual C++ 6.0. Danke im voraus.

    mfg

    Mole



  • Hi,

    ja natürlich sind da Fehler drin, in welchem Programm eines Anfängers sind keine Fehler? Aber der Compiler deiner Wahl wird dir schon anzeigen wo die Probleme liegen. Verusch das mal zu kompilieren und arbeite dich durch die Compilerfehlermeldungen - da lernst wesentlich mehr, als wenn wir dir jetzt sagen wo die Probleme liegen.

    sqrt ist übrigens die Wurzelfunktion aus der math.h

    Ein Array mit definierbarer Größe geht übrigens so:

    int *i = new int[size];
    

    Da sollte size aber vorher einen sinnvollen Wert haben.

    Viel Spaß beim Proggen,

    Patrick



  • mir sind in deinem code ein paar fehler aufgefallen:

    1. das, was schon bluphx schrieb: du mußt das array so deklarieren:
    int *array=new[size+1];
    
    1. dein code läßt den wert von array[0] und array[1] auf 1 stehen!

    2. mir ist nicht klar, warum du in

    for (n=1; n<(int) (boundary/ j); n++)
    

    boundary/j anstelle von boundary schreibst. wenn du vermeiden willst, das eine multiplikation zweimal durchgeführt wird, dann geht das so:

    for(n=1; n<=j; n++)
    
    1. deine schleife durchläuft nicht alle elemente des arrays! es blieben deshalb viele array-elemente auf 1, obwohl deren indizes keine primzahen sind. am besten, du stellst erst sicher, das size eine quadratzahl ist.

    da hast du dir für deinen ersten versuch gleich was ziemlich kniffliges ausgesucht. aber lass dich von der ellenlangen fehlerliste nicht entmutigen. da mußte jeder anfänger mal durch 😃



  • Konfusius schrieb:

    1. das, was schon bluphx schrieb: du mußt das array so deklarieren:
    int *array=new[size+1];
    

    Falsch

    int *array=new int[size+1]
    

    war richtig. Bei dir weis der Compiler nicht, was er für ein Array anlegen soll



  • tschuldigung, tippfehler 🤡



  • Danke für Eure Hinweise. Leider komme ich jetzt erst wieder dazu mich mit dem Programm zu beschäftigen.

    Ich denke der Tipp, auf die Fehlermeldungen des Compilers zu reagieren und daraus irgendwie sein Code zu basteln, ist gar nicht mal so schlecht. Also fang ich mal an und werde berichten, wenn etwas noch im unklaren bleiben sollte.


Anmelden zum Antworten