2016-12-07 3 views
-4

Schwierigkeiten dabei, eine Erklärung dafür zu finden.Was macht dieser Vektor-Array-Code? (C++)

Was macht dieser Code? Ich verstehe, dass es eine Reihe von Vektor erzeugt, aber das ist es. Wie kann ich das Vektor-Array drucken und auf Elemente zugreifen, um damit zu experimentieren?

#define MAXN 300009 
vector<int>dv[MAXN]; 
int main() 
{ 
    for(int i=1;i<MAXN;i++) 
    for(int j=i;j<MAXN;j+=i) 
     dv[j].push_back(i); 
} 
+1

Durch Indizieren in das RAW-Array und Verwenden der Vektor-API für das referenzierte Element. – StoryTeller

+3

Was genau verwirrt dich?Es ist ein sehr einfaches Programm. Wenn Sie C++ lernen, lernen Sie bald. – Matthias

+0

Siehe diese detaillierte Dokumentation: http://StackOverflow.com/documentation/c%2b%2b/511/Stdvector#T=201612070849588202046 – CinCout

Antwort

0

Der Code ist einfach genug zu instrumentieren. Die Realität dessen, was es produziert, ist eine sehr einfache (und sehr ineffiziente) Sieve of Eratosthenes. Wenn Sie diesen Algorithmus verstehen, werden Sie sehen, was dieser Code bewirkt, um das zu erzeugen.

Edit: Es ist auch ein Faktor-Tabellengenerator. Siehe Bearbeiten unten.

Den Code und Dumping-Ausgabe nachinstrumentieren und reduzieren die Anzahl der Schleifen zur Vereinfachung haben wir so etwas wie der folgende Code. Wir verwenden range-based-for Schlaufen in der Anordnung von Vektoren über jeden Vektor Aufzählen:

#include <iostream> 
#include <vector> 

#define MAXN 20 
std::vector<int>dv[MAXN]; 

int main() 
{ 
    for(int i=1;i<MAXN;i++) 
    { 
     for(int j=i;j<MAXN;j+=i) 
      dv[j].push_back(i); 
    } 

    for (auto const& v : dv) 
    { 
     for (auto x : v) 
      std::cout << x << ' '; 
     std::cout << '\n'; 
    } 
} 

Die resultierende Ausgabe ist:

1 
1 2 
1 3 
1 2 4 
1 5 
1 2 3 6 
1 7 
1 2 4 8 
1 3 9 
1 2 5 10 
1 11 
1 2 3 4 6 12 
1 13 
1 2 7 14 
1 3 5 15 
1 2 4 8 16 
1 17 
1 2 3 6 9 18 
1 19 

Nun beachten jeden Vektor, der nur zwei Elemente (1 und eine zusätzliche Nummer). Diese zweite Nummer ist prime. In unserem Testfall diese beiden Elementvektoren sind:

1 2 
1 3 
1 5 
1 7 
1 11 
1 13 
1 17 
1 19 

Kurz gesagt, dies ist ein sehr einfach ist, und unglaublich ineffizient Primzahlen zu finden. Eine geringfügige Änderung in den Ausgangsschleifen, um nur das zweite Element aller Vektoren der Länge-nur-zwei auszugeben, wird daher alle Primzahlen erzeugen, die niedriger als MAXN sind. Daher verwenden:

for (auto const& v : dv) 
{ 
    if (v.size() == 2) 
     std::cout << v[1] << '\n'; 
} 

Wir werden alle Primzahlen von [2...MAXN)


bearbeiten erhalten: Faktor Tabellengenerierung

Wenn es nicht offensichtlich ist, hat jeder Vektor ein End-Element (Das stimmt nicht zufällig mit den Indizes des äußeren Arrays überein. Alle vorhergehenden Elemente bilden die positiven Faktoren dieser Zahl. Zum Beispiel:

1 2 5 10 

ist der dv[10] Vektor, und sagen Sie 10 Faktoren 1,2,5,10 haben. Ebenso ist

1 2 3 6 9 18 

der dv[18] Vektor, und sagen Sie, 18 Faktoren haben 1,2,3,6,9,18.

Kurz gesagt, wenn jemand alle Faktoren einer gewissen Anzahl N, die die Umsetzung all diese Informationen in tabellarische Form < MAXN, dies wäre ein Weg, um wissen wollte.

+0

Vielen Dank! Dies war ein kleiner Teil einer größeren kompetitiven Kodierungslösung, die ich zu verstehen versuchte. Ich glaube, dass es für etwas anderes als Primzahl Generation verwendet wird. Jetzt kann ich es verstehen – borb183

+0

@ borb183 sie verwenden es wahrscheinlich für eine Faktortabelle, die es auch erzeugt. Hinzufügen dieser zur Antwort jetzt. Froh, dass du es verstehst. – WhozCraig