Algorithmus zu Finden aller schwachen Kompostionen



  • Ah super,

    die Idee habe ich verstanden:) Jetzt weiß ich nicht mehr, wie ich im Code die Variablenwerte für n und k angebe. 😮 Muss ich sie in den Zeilen 26 und 27 initialisieren?

    Erstaunlich, dass die Ausgabe so viel Zeit in Anspruch nimmt 🙂

    Viele Grüße!



  • In cookies Code werden sie genau hier übergeben:

    std::cout << "k: "; 
        std::cin >> n; 
        v.resize(n); 
        std::cout << "n: "; 
        std::cin >> n; 
        v[0] = n;
    

    Wenn du das in eine Funktion packen willst, die die Werte als Parameter übernimmt, bleiben nur die vector<>-Operationen übrig:

    v.resize(k);
    v[0]=n;
    

    PS: Daß die Ausgabe so viel Zeit in Anspruch nimmt, überascht mich jetzt nicht wirklich 😉 Davon dürfte das meiste von Windows verbraten werden, das nach jeder Ausgabe das Konsolenfenster neu zeichnet.

    Afair hatte volkard vor einer Weile mal was zu der Thematik gesagt. Ich gehe mal auf die Suche.



  • firfan schrieb:

    Erstaunlich, dass die Ausgabe so viel Zeit in Anspruch nimmt 🙂

    Eigentlich nicht. 🙂
    Du musst bedenken, was jeder Grafikcall an Rechenkraft kostet! Jeder Pixel muss einzeln gesetzt werden, das dauert ewig.

    firfan schrieb:

    Jetzt weiß ich nicht mehr, wie ich im Code die Variablenwerte für n und k angebe.

    Guck dir noch mal meinen Code oben an. Da kannst du n und k angeben, wie du möchtest. Ansonsten: die Größe des Vektors ist gleich k, n wird der Funktion ja übergeben. (Der Parameter heißt auch n.)

    Allerdings solltest du dringend die C++ Grundlagen lernen, falls du solche Aufgaben noch öfter zu erwarten hast.



  • Danke, dass ihr so hilfsbereit seid. Ja, ich brauche unbedingt ein gutes C++ Buch, dass mir die Grundlagen strukturiert erklärt.

    Was mache ich falsch, wenn meine main-funktion so aussieht. "count" stimmt nicht mehr mit meiner Rechnung überein. 😕

    int main()
    {
      int n = 30;
      int k = 5;
      std::vector<int> v;
    
      while (1)
      {
        v.clear();
        v.resize(k);
        v[0] = n;
    
        int count = 0;
    
        do {
          for (std::vector<int>::iterator i = v.begin(); i < v.end(); ++i)
          ++count;
        } while (perm_next(v, n));
    
        std::cout << "count: " << count << std::endl;
        std::cout << "----------" << std::endl;
      }
    } 
    }
    


  • Du hast vermutlich die Ausgabe(?)-Anweisung in der for-Schleife weggelassen - und dadurch bezieht sich das for() jetzt auf die nächste verfügbare Anweisung: ++count;



  • Ah stimmt, daran liegt's! 🙄 Jetzt funktioniert alles einwandfrei. Es werden alle Kompositionen gefunden. Ich verwende die Kompositionen als Input für eine andere Funktion, worüber ich mir jetzt ein paar Gedanken machen werde.

    Vielen herzlichen Dank für eure Hilfe!!! Ihr seid spitze! 👍


Anmelden zum Antworten