welcher Befehl



  • Hallo,

    ich habe ein funktionierendes Macro, welches die Ketten der ungeraden Nichtprimzahlen zählt. (Also die Abstände zwischen den Primzahlen)
    Der Ausdruck sieht so aus:
    KetNr:18 115 - 6-er Kette
    KetNr:19 129 - 1-er Kette
    KetNr:20 133 - 2-er Kette
    KetNr:21 141 - 4-er Kette

    Zuerst Kettennnummer, dann Anfangsglied, und dann die Kettenlänge

    Jetzt möchte ich, daß er noch die einzelnen Kettenlängen zählt.
    Es sollte dann so aussehen:
    KetNr:18 115 - 1. 6-er Kette
    KetNr:19 129 - 10. 1-er Kette

    Das stellt für mich eine Schwierigkeit dar, denn ich muß für jede Kettenlänge einen Speicher und einen Zähler haben, will das aber nicht per Hand anlegen, da ich das untersuchte Intervall und die Intervalllänge offen halten will. Also, wenn es in dem untersuchten Abschnitt 27 verschieden lange Ketten gibt, braucht man 27 Zähler ... etc. Das müßte alles in eine Funktion gepackt werden. Ich hab sowas mal in Word Perfect programmiert, mit var(var) ging das, aber noch nicht in C++. Gehen tut das, hab bloß keine Idee, wie, bzw. mit welchen Befehlen ....

    bin Anfänger und Hobbyprogrammierer ...



  • Du kannst solche Probleme im allgemeinen mit einer std::map lösen. Hier von Länge der Lücke (Key) auf die Anzahl.

    Hier bietet sich allerdings auch std::vector an, den du mindestens so groß wie die größte Lücke machen müsstest (alternativ nimm irgendeine Startgröße und nutze resize, wenn nötig). Dann zählst du in v[Lücke Länge] die Anzahl hoch.



  • wob schrieb:

    Hier bietet sich allerdings auch std::vector an, den du mindestens so groß wie die größte Lücke machen müsstest

    auch das müßte automatisiert ablaufen, da ich im Vorhinein nicht weiß, wie groß die Größte Lücke ist.

    Also fallen nicht erweiterbare Container mal schon aus ....



  • otto56 schrieb:

    auch das müßte automatisiert ablaufen, da ich im Vorhinein nicht weiß, wie groß die Größte Lücke ist.

    Das habe ich doch bedacht (in der von dir nicht mitzitierten Klammer). vector ist doch mittels resize vergrößerbar.

    Außerdem wachsen die Primzahlen so viel schneller als die Lücken, dass die Lücken << Primzahl sind. Du musst also schon zu sehr großen (>1e18) Primzahlen vordringen, um einen vector der Länge ~800 zu benötigen.



  • Also, ich hab jetzt 2 Variablen: Kettenzähler, da ist die Länge der aktuellen Kette drin und
    Ktnnr, da ist die laufende Nummer der Kette drin, die einfach per Increment hochgezählt wird.

    jetzt brauch ich automatisiert für die jeweilige Länge einen andere über die Länge automatisierte Variable, die die spezielle Kette nummeriert, der name muß automatisiert sein, und die Länge im Namen enthalten, ...? dazu genügt doch vector nicht, weil in Vector ja nur eine Datenkette gespeichert werden kann, oder kann jedes einzelne Zelle dort gezielt hochgezählt werden? Dann käme ich mit dem Resize durcheinander.....

    Mach doch bitte mal einen Funktonsvorschlag...

    Wie kann man z.b. das 6. Element eines Vektors um eins erhöhen?



  • otto56 schrieb:

    Wie kann man z.b. das 6. Element eines Vektors um eins erhöhen?

    So:

    std::vector<int> v(1000); // 1000 reicht für deine Zwecke aus...
    
    ++v[6]; // ist das 7. Element, aber das "0." kann man verschwenden
    

    Alternativ ist es vielleicht mit der Map einfacher, weil du dir da gar keine Gedanken um Größe etc. machen musst:

    std::map<int, int> m;
    (...)
    ++m[6];
    


  • Danke, ich probier es und melde mich zurück ....

    hab dies geschrieben zur Probe

    #include <iostream>
    #include <vector>
    
    int main()
    {
        std::vector<int> v;
        int i;
    
        for (i=0; i<15; ++i) {
            v.push_back(i); // Fügt i ans Ende von v an.
            ++v[i]; // v[i] muss bereits existieren.
        }
        for(auto it = v.begin(); it != v.end();it++)
        {
            std::cout<<""<< *it<<" "; // Hier spuckt er aus
        }
        ++v[6];
        std::cout<<"\n";
    
        for(auto it = v.begin(); it != v.end();it++)
        {
            std::cout<<""<< *it<<" "; // Hier spuckt er aus
        }
    }
    

    1. Jemand sagte mal das auto it ist umständlich. Es gibt was leichteres. Weißt Du was er meint?

    2. Was heist eigentlich das std:: und warum muß es manchmal hin, manchmal nicht, hab doch inoutstream eingebunden...?

    3. Ich denke mir map wäre besser, weil man da neben einem Zähler auch noch die jeweiligen Kettenanfänge speichern könnte .... habe bloß nich nie mit map programmiert ...



  • wob schrieb:

    Alternativ ist es vielleicht mit der Map einfacher, weil du dir da gar keine Gedanken um Größe etc. machen musst:

    std::map<int, int> m;
    (...)
    ++m[6];
    

    In map ab er sind, soviel ich weiß, 2 zueinandergehörende Werte gespeichert. Wenn ich nun nur den A Wert um eins erhöhen will, und den B Wert um eins erniedrigen. Wie mach ich das?


Anmelden zum Antworten