Erstellen eines c++ Programms dass variationen ohne wiederholungen berechnet



  • Hallo alle zusammen

    ich habe ein probelmm ich hänge fest und finde leider nichts passendes was mir weiter hilft in google.

    Ich möchte ein C** Programm erstellen, welches variationen ohne Wiederholungen berechen kann.

    Formel hierfür
    n!
    ----
    (n-K)!

    Nun um die fakultät berechnen zu lassen hätte ich schon mal was und zwar
    using namespace std;

    int main()

    {

    int fakultaet = 1, eingabe;

    cout << "Von welchem Wert soll die Fakultaet berechnet werden? ";

    cin >> eingabe;

    for (int i = eingabe; i > 0; i--)

    fakultaet = fakultaet * i;

    cout << "Das Ergebnis ist " << fakultaet << endl;
    {
    aber weiter komme ich nicht
    ich habe keinen ansatz bzw. fällt mir einfach keiner ein
    meine 1. überlegeung war

    nun die daten für n und k einlesen zu lassen
    und dan von diesen wieder die fakultät berechenen zu lassen.

    Und danach fakultät 1 / fakultät 2 teilen zu lassen

    Doch das klingt selbt mir nicht so gans logisch,

    bitte kann mir jemand helfen ich benötige dringend denk anstöße bzw. grund ideen für ein skript

    😕 😕 😕 😕 🙂 😕 😕

    ---bitte



  • Willst du die Anzahl der Wiederholungen (mit Berücksichtigung der Reihenfolge) berechnen? Denn dafür ist n! / (n-k)! da.

    Du könntest natürlich zuerst n! ausrechnen, dann (n-k)! und anschließend die Werte dividieren, aber es wäre noch geschickter, einfach das Produkt (n-k+1) * (n-k+2) * ... * n auszurechnen.



  • Und was wäre einfacher?
    wären die zwei formeln das selbe?
    Es sollen keine Wiederholungen berücksichtigt werden



  • evy schrieb:

    Und was wäre einfacher?

    Das nimmt sich nicht viel. Die zweite Variante funktioniert für größere Zahlen, da es nicht so schnell zu einem Überlauf kommt.

    wären die zwei formeln das selbe?

    Ja.

    Es sollen keine Wiederholungen berücksichtigt werden

    Was genau verstehst du unter einer Wiederholung?



  • Es gibt ja zwei varianten
    die 1. ist mit zurücklegen also ich nehme die zahl nicht entgüldig raus , dies wäre dann die variante der Wiederholung

    die 2. ohne Zürücklegen , sprich die zahl fällt aus dem pott so zu sagen , dies wäre dann die variante ohne Wiederholung

    die formel für mit Wiederholung ist simpel
    n/k
    ohne wiederholung ist
    n!/(n-k)!

    So weit hab ich das auch alles begriffen und rechnen kann ich damit schon auch das
    aber in einen Script zu bringen fällt mir einfach schwer .
    Weil ich keine Vergleichspunkte habe an den ich mich orientieren kann.

    So mein Gedanke :
    Ich lass von n! die fakultät berechnen ,
    dann soll das programm sich diesen wert merken.

    Dan soll mann den wert für N und für K einlesen.
    diese Subtrahierne und den wert merken
    von diesem wert die fakultät ausrechen , auch diesen wert merken
    und dan fakultät 1 durch fakultät 2 teilen

    bin ich auf dem richtigen weg?
    Und wie mach ich das ?



  • evy schrieb:

    die formel für mit Wiederholung ist simpel
    n/k

    Eigentlich ists n^k.

    So mein Gedanke :
    Ich lass von n! die fakultät berechnen ,
    dann soll das programm sich diesen wert merken.

    Dan soll mann den wert für N und für K einlesen.
    diese Subtrahierne und den wert merken
    von diesem wert die fakultät ausrechen , auch diesen wert merken
    und dan fakultät 1 durch fakultät 2 teilen

    bin ich auf dem richtigen weg?

    Die Reihenfolge stimmt noch nicht. Du berechnest bereits n!, bevor du n überhaupt einliest.



  • was hälst du davon?

    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main()

    {
    int zahln, zahlk, wert1, wert2;
    cout << " Geben Sie eine Zahl für n ein" <<;
    cin >> eingabe1;
    cout << " Geben Sie eine Zahl für k ein " <<;
    cin >< eingabe2;
    nt fakultaet = 1, eingabe;

    for (int i = eingabe1; i > 0; i--)

    fakultaet = fakultaet1 * i;

    wert1 😞 eingabe1 * eingabe2);

    for (int i = wert1; i > 0; i--)

    fakultaet = fakultaet2 * i;

    wert2 = (fakultatet1% fakultaet2)

    cout << "Das Ergebnis ist " << wert2 << endl;
    return 0;

    }



  • Du könntest deine Programme wenigstens mal ausprobieren, bevor du sie postest 🙄

    Und schau dir mal die Operatoren an. Dividieren tut man mit /, % ist Modulo.



  • Ja
    ich weis das dieses Programm nicht läuft , es ist ein Prototyp ich will wissen ob ich auf dem richtigen weg bin bzw. Wo ich ansetzen muss, oder ob der Grundgedanke schon falsch ist.



  • Woher soll man das wissen? Der Grundgedanke ist aus diesem Trümmerhaufen nicht erkennbar. Ich weiß ehrlich gesagt auch nicht, was man hier großartig für Grundgedanken braucht. Du hast eine Formel, und der naive Ansatz ist, sie einfach so, wie sie dasteht, zu implementieren.

    n! / (n-k)!

    Subtraktion und Division ist in die Sprache eingebaut, es fehlt nur die Fakultät. Die kriegst du offensichtlich mithilfe von Schleifen hin. Eingabe/Ausgabe ist klar. Fehlt noch was?

    Wenn du das hinkriegst, solltest du dich allerdings fragen, ob man das nicht noch besser lösen kann. Dazu hast du hier auch schon einen Tipp bekommen.



  • Sorry aber deine Antwort hilft mir gerade nicht groß weiter ,
    eine genaue bezeichung und erklärung meiner fehler wären toll.

    Wo ist mein fehler , was ist mein fehler und zwar genau das würde mir weiter helfen.

    Und deshalb bin ich hier um genaue hilfe und tipps zu bekommen und zwar so ausgedrückt das ich sie versteh und umsetzen kann.



  • evy schrieb:

    Sorry aber deine Antwort hilft mir gerade nicht groß weiter

    Das tut mir leid.

    eine genaue bezeichung und erklärung meiner fehler wären toll.

    Mach aus deinem Prototypen ein richtiges, ernstgemeintes Programm und melde dich dann nochmal.


  • Mod

    evy schrieb:

    Sorry aber deine Antwort hilft mir gerade nicht groß weiter ,
    eine genaue bezeichung und erklärung meiner fehler wären toll.

    #include <cstdlib>  // Schlecht. Benutzt du nicht
    #include <iostream>
    
    using namespace std;
    
    int main()
                // Schlecht. Ungewöhnliche Leerzeilen
    {
    int zahln, zahlk, wert1, wert2;    // Sehr schlecht. Nichtssagende Namen. zahln und zahlk werden nirgendwo benutzt. wert1 und wert2 viel zu früh deklariert.
    cout << " Geben Sie eine Zahl für n ein" <<;   // Falsch. Auf << kann kein ; folgen
    cin >> eingabe1;  // Falsch. eingabe1 ist nicht deklariert.
    cout << " Geben Sie eine Zahl für k ein " <<;  // Falsch. Auf << kann kein ; folgen
    cin >< eingabe2;   // Falsch. Auf > kann kein < folgen. eingabe2 nicht deklariert
    
    nt fakultaet = 1, eingabe;  // Falsch. Datentyp nt exisitert nicht. Schlecht. Variable eingabe wird nirgends benutzt
    
    for (int i = eingabe1; i > 0; i--)
    
    fakultaet = fakultaet1 * i;   // Schlecht. *= benutzen um zu zeigen, was man will.
    
    wert1 =( eingabe1 * eingabe2);  // Falsch. Du brauchst für die Formel nirgends eingabe1 multipliziert mit eingabe2
    
    for (int i = wert1; i > 0; i--)
    
    fakultaet = fakultaet2 * i;  // Falsch. fakultaet2 nicht deklariert. Rechnung falsch.
    
    wert2 = (fakultatet1% fakultaet2)  // Falsch. Rechnung falsch
                                       // Falsch. Fehlendes Semikolon
    cout << "Das Ergebnis ist " << wert2 << endl;  // Schlecht. endl, wo '\n' gedacht ist.
    return 0;  // Schlecht. Nicht verstanden, welche Sonderregeln für main gelten.
               // Schlecht. Ungewöhnliche Leerzeilen
    }
    

    Verstehst du nun, warum Bashar dein Programm einen Trümmerhaufen genannt hat und dir nicht konkrete Fehler nennen konnte?



  • vielen vielen dank mit dieser hilfe kann ich arbeiten ,
    ich werde mich sofort dran setzen und deine anmerkungen umsetezen
    danke schön.


  • Mod

    evy schrieb:

    vielen vielen dank mit dieser hilfe kann ich arbeiten ,
    ich werde mich sofort dran setzen und deine anmerkungen umsetezen
    danke schön.

    Es ist frustrierend, wenn der TÜV ein Haus zur Notsprengung deklariert und der Hausbesitzer dies als Aufforderung versteht, die kaputten Glühbirnen zu wechseln.



  • Hier eine Variante für die Experten, die ganz ohne Rekursion und Multiplikation auskommt ...

    #include <iostream>
    #include <functional> // plus<>
    #include <numeric> // adjacent_difference
    #include <vector>
    
    template< typename T >
    T n_ueber_k( T n, T k )
    {
        using namespace std;
        vector< T > line;
        for( ; line.push_back( T(1) ), n > 0; --n )
            adjacent_difference( line.begin(), line.end(), line.begin(), plus< T >() );
        return line.at( k );
    }
    
    int main()
    {
        using namespace std;
        for( int n, k; cin >> n >> k; )
            cout << n << " ueber " << k << " = " << n_ueber_k( n, k ) << endl;
        return 0;
    }
    

    Gruß
    Werner



  • Gesucht ist nicht (nk)=n!(nk)!k!\binom{n}{k} = \frac{n!}{(n-k)!k!}, sondern n!(nk)!\frac{n!}{(n-k)!}. (In der Hoffnung, dass dein Code auch tatsächlich ersteres berechnet 😉 )



  • Bashar schrieb:

    Gesucht ist nicht (nk)=n!(nk)!k!\binom{n}{k} = \frac{n!}{(n-k)!k!}, sondern n!(nk)!\frac{n!}{(n-k)!}. (In der Hoffnung, dass dein Code auch tatsächlich ersteres berechnet 😉 )

    Bashar der Experte hat's gemerkt 👍 - mein Code berechnet (nk)=n!(nk)!k!\binom{n}{k} = \frac{n!}{(n-k)!k!}. Das wäre die Anzahl der Variationen ohne Wiederholung und ohne Beachtung der Reihenfolge.

    Gruß
    Werner



  • Werner: Nette Art, das Pascalsche Dreieck aufzubauen. Aber etwas rechenintensiv, wenn man nur an einem Eintrag interessiert ist 😉



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten