Alle Kombinationen mit variabler Anzahl von Items



  • nein nicht direkt, nur das das halt einfach von 0 bis 999 zählt, aber das funzt ja nicht bei zum Beispiel 123 Werten...



  • Tipp: for-Schleife(n)!


  • Mod

    Bigbang2012 schrieb:

    nein nicht direkt, nur das das halt einfach von 0 bis 999 zählt, aber das funzt ja nicht bei zum Beispiel 123 Werten...

    Ich zähle mal mit 16 Werten:
    0 0
    0 1
    ...
    0 9
    0 A
    ...
    0 F
    1 0
    ...
    F F

    Macht's nun Klick?



  • Ist wie bei Kilometerzaehler ...



  • musst du die fkt selbst bauen?
    oder kannst du auch std::next_permutation nutzen?



  • unskilled schrieb:

    musst du die fkt selbst bauen?
    oder kannst du auch std::next_permutation nutzen?

    std::next_permutation ist nicht die Loesung des Problems.



  • knivil schrieb:

    unskilled schrieb:

    musst du die fkt selbst bauen?
    oder kannst du auch std::next_permutation nutzen?

    std::next_permutation ist nicht die Loesung des Problems.

    und sicher nicht die effektivste, wenn man nur 0-F als mögliche werte hat, ja.
    für 0-[>F] fällt mir allerdings gerad nix anderes ein


  • Mod

    unskilled schrieb:

    knivil schrieb:

    unskilled schrieb:

    musst du die fkt selbst bauen?
    oder kannst du auch std::next_permutation nutzen?

    std::next_permutation ist nicht die Loesung des Problems.

    und sicher nicht die effektivste, wenn man nur 0-F als mögliche werte hat, ja.
    für 0-[>F] fällt mir allerdings gerad nix anderes ein

    Ich muss wohl mit den subtilen Tipps aufhören.

    Dann eben die Lösung, da Ratschläge anscheinend nicht funktionieren: Der Threadersteller beschreibt das Zählen in einem b-adischen Zahlensystem mit N Stellen. Dabei ist b die Anzahl der "Werte" und N die Anzahl der "Items". Man braucht also bloß eine einzelne Schleife die von 0 bis (b^N)-1 zählt, die gesuchten Kombinationen sind dabei die Darstellung des Zähler im b-adischen System (klingt kompliziert ist aber nur allgemeine Transformation zwischen Ziffensystemen anwenden, ganz einfach). Ob man die Ziffern dabei '0' bis 'F' bezeichnet oder '1' bis '10' oder sie nach den eigenen Lieblingstransformers benennt, ist Wurst.



  • #include <iostream>
    #include <ostream>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    
    using namespace std;
    
    /// interpretiert den Vektor 'was' als Darstellung einer Zahl im
    /// Stellenwertsystem zur Basis 'basis' (\sum_k was[k] * basis^k)
    /// und inkrementiert diese Zahl um eins. Ein Überlauf wird per
    /// Rückgabewert true signalisiert.
    bool inkrementiere(vector<int> & was, int basis);
    
    int main()
    {
    	const int basis   = 10;
    	const int stellen = 3;
    	vector<int> z (stellen);
    	do {
    		copy(z.begin(),z.end(),ostream_iterator<int>(cout," "));
    		cout << endl;
    	} while (!inkrementiere(z,basis));
    }
    

    Kommst Du drauf, wie inkrementiere auszusehen hat?



  • Warum so kompliziert? Ist das nicht einfach wie bei einem Zahlenschloss? Also
    Anzahl der Werte^Anzahl möglicher Items^ ?



  • Natürlich ist das so, und jetzt überlege mal, was ein Zahlenschloss ist. 😉



  • cooky451 schrieb:

    Natürlich ist das so, und jetzt überlege mal, was ein Zahlenschloss ist. 😉

    Ein Kilometerzaehler ...


Anmelden zum Antworten