2017-10-22 2 views
0

Q: Finden Sie alle Primzahlen zwischen zwei gegebenen Zahlen a und b, indem Sie verwenden.Wie verwendet man dynamische Arrays?

Ich verwende dynamisches Array, um Primzahlen zu speichern, aber es funktioniert nicht.

Nach dem Debuggen ist alles in Ordnung, bis die letzte printf(), die abstürzt.

-Code

int main() { 

    int i, j, n, a, b, k; 
    int *tab; 
    scanf("%i", &n); // n is number of sets 

    for (i = 1; i <= n; i++){ 
     scanf("%i %i", &a, &b); 

     tab = (int*) malloc(b * sizeof(int)); //allocating the memorry 

     for (j= 0; j < b; j++){    //seting all numbers to be prime 
      *(tab + j) = 1; 
     } 

     for (j = 2; j <= b; j++){ 

      if (*(tab + j) == 1){ 
       for(k = j; k <= b; k+=j) 
        *(tab + k) = 0;  //seting 0 for all non prime numbers 
      } 

     } 

     for (j = a; j <= b; j++){ 
      if (*(tab + j) == 1){ 
       printf("%i", j);   //printing prime numbers 
      } 
     } 
     free(tab); 
    } 
    return 0; 
} 
+2

Ihr 'Tab' hat nur' b' Elemente. Dein Code greift bis zu "(b + 1) * (b + 1)" von ihnen. Das macht keinen Sinn. – melpomene

+2

Sie greifen über den Bereich des Arrays hinaus. – BLUEPIXY

+1

Bitte verwenden Sie nicht '* (tab + j)'. Verwenden Sie stattdessen 'tab [j]'. Es ist die geweihte Art des Zugriffs auf Array-Elemente. Es ist viel klarer und einfacher. – bolov

Antwort

0

sollte Ihre zweite Schleife

 for (j = 2; j <= b; j++){ 

     if (*(tab + j) == 1){ 

      for(k = j; k <= b; k += j) 
       *(tab + k) = 0; //seting 0 for all non prime numbers 
     } 

    } 

das Problem war, dass, weil Sie Multiplikation verwendet, Sie über ihre zugewiesene ein Element in der Registerkarte Array mit dem Index für den Zugriff versucht Größe.

edit: und wie @melpomene angegeben, ist das Array zu kurz. Daher sollte die Zuteilung

  tab = (int*) malloc((1+b) * sizeof(int)); 
+2

Das geht immer noch außerhalb der Grenzen. – melpomene

+0

@melpomene danke, ich habe deinen richtigen Kommentar hinzugefügt. –

0

sein Das Problem ist, du Zugriff auf Sie Array aus seiner Grenzen:

*(tab + k*j) = 0; 

wenn

k <= b 
j <= b 

Wenn Sie Array von b Elemente erklären , Sie können nur auf Array von 0 bis b-1 Index zugreifen.

BTW, wie in den Kommentaren erwähnt, mit tab[k*j] ist lesbarer und zeigt deutlich, dass Registerkarte Array ist.

Ich verstehe nicht wirklich, was Sie mit Sätzen Nummer meint, aber Pseudocode von Sieve von Eratosthenes aus Wiki übernommen wird von 2 bis n angewendet. Also in Ihrem Fall wird 2 ein und n wird b. Sie müssen nicht alle Nummern von a bis b überprüfen, Root von b wird ausreichen. Ihr Algorithmus sollte folgendermaßen aussehen:

  1. Array erstellen zum Halten b - a Elemente
  2. machen jedes Element gleich 1
  3. machen 0 Elemente, die Eratosthenes Regeln für komplexe Zahl
  4. Druck Indizes erfüllen die 1.
  5. enthält
+0

Danke ich arbeite daran. Zum Beispiel bedeuten 2 Zahlensätze, dass alles doppelt gemacht wird. –

Verwandte Themen