K-Composite: Dynamisches Array



  • Liebe Forenuser,
    Im studiere Physik im ersten Jahr und muss Grundlagen von C++ erlernen.
    Uns wurde die Aufgabe erteilt, ein Programm zu schreiben, welches 2 Zahlen n und k einliest (k, n >= 0) und im Intervall [2.......n-1] alle Zahlen ausgibt, die genau durch k verschiedene Primzahlen teilbar sind.

    Der Code, den ich geschrieben habe, funktioniert für kleine n. Sobald ich jedoch n = 1000 oder mehr einlese, dann stürzt das Programm ab und Windows zwingt mich, das Proramm zu schliessen.

    #include <iostream>
    using namespace std;
    int main(){
    
        unsigned long int n, k, q = 0, amountprimes=0;
        bool prime ;
        cout << "give me n: ";     cin >> n;
        cout << "give me k: ";     cin >> k; cout << "computing..\n";
    
        //Create bool array that is false if prime at i'th place. 
        bool* const crossed_out = new bool[n];
        for (int i=0; i<n; ++i) crossed_out[i] = false; //init false
        for (int i=2; i<=n; ++i){
                if (!crossed_out[i]){
                   for(int u=2*i; u <= n; u+=i)
                           crossed_out[u] = true;
                   }
                }
        //count amount of primes
        for(int i=2; i<n; ++i){
                if(crossed_out[i] == false) ++amountprimes;
                }
        //make array with the primes
        int* const primes = new int[n];
        for(int i=2, z=0; i<=n; ++i){
                //if at i'th place not crossed out, store i'th number in array primes;
                 if(crossed_out[i] == false){
                                   primes[z]=i;
                                   z++;
                                   }
                 }
    ///////////////////////////////////////////////////////////////////
    //now we have the primes in the array primes[i]
    
        cout << "the following numbers in the interval {2,,,,," << n-1 << "}" 
             << " are " << k << "-composite:" << endl;
    
        //the number i will be m-composite:
        int m, counter = 0; 
        for(int i=2; i<n; ++i){           //Do it for all numbers < n
                m=0;  //reset m
    
                //if i divisible by prime, i is (m+1)-composite
                for(int r=0; r<amountprimes && r<i; ++r){
                        if (i % primes[r] == 0) m++;
                        }
    
                if (m == k){ 
                      cout << i << endl; //check if k-composite. 
                      ++counter;        //if yes, increment counter. 
                      }
                }
        cout << " -> there are " << counter << " " << k << "-composite numbers in this interval." << endl;
        delete primes; 
        delete crossed_out;
        system("pause");
        return 0;
        }
    

    Wie man sieht, habe ich zwei Arrays gebraucht, deren Länge beim Kompilieren noch nicht feststand. Ist es möglich, dass die Länge eines Speicherblocks aus dem Heap beschränkt ist?
    Ich wünsche euch ein schönes Wochenende,
    Gruss,
    Pueggel


  • Mod

    1. new[] und delete[] benutzt man nicht. Das ist nur die unsichere Variante von vector, ohne jeden Vorteil.
    2. Übersetzung der Ausgabe von valgrind:

    Zeile 16 schreibt 1 über das Array hinaus
     Zeile 14 liest 1 hinter dem Array
     Zeile 21 liest 1 hinter Array
     Die deltes am Ende sind falsch, es muss delete[] heißen. Aber siehe dazu Punkt 1.
    

    edit 3.: Eine aktuelle Diskussion über das Sieb des Eratosthenes mit Beispiel findest du hier:
    http://www.c-plusplus.net/forum/p2143240#2143240



  • Hallo SeppJ
    Vielen Dank für deine Antwort! Ist gut möglich, dass die Methode, welche ich benutze, man gar nicht benutzen sollte. Jedoch erwartet man von uns, nur die jeweilige Syntax zu gebrauchen, welche wir bis bereits kennengelernt hatten. Ich habe das Programm noch in einem virtuellen OpenSUSE laufen gelassen - da läuft es einwandfrei!
    Schönes Wochenende wünscht euch
    Pueggel


  • Mod

    Das ist deine Reaktion? 😡 Augen zu, es funktioniert auf einem bestimmten System, Lalala, ich kann euch nicht hören?

    Dein Programm ist falsch, ich habe dir sogar gesagt, was falsch ist. Mit dieser Einstellung wirst du spektakulär scheitern.



  • SeppJ schrieb:

    Das ist deine Reaktion? 😡 Augen zu, es funktioniert auf einem bestimmten System, Lalala, ich kann euch nicht hören?

    Dein Programm ist falsch, ich habe dir sogar gesagt, was falsch ist. Mit dieser Einstellung wirst du spektakulär scheitern.

    Lieber SeppJ,
    Anscheinend habe ich vergessen zu sagen, dass ich die Fehler, auf die du mich hingewiesen hast, korrigiert habe. Ich bin dir deshalb sehr dankbar. gut möglich, dass ich scheitere, aber an der Informatik solls nicht liegen 🙂
    Ich wünsche dir ein schönes Wochenende!


Anmelden zum Antworten