C++ Code Umsetzung für Mathe Formel n!/(n-k)! Aufgabe( Berechnung Variationen ohne Wiederholungen)



  • Hallo zusammen,

    ich habe folgende Aufgabe zu lösen. Es geht um Mengenlehre und Variationen. Leider ist meine Mathe-Kenntniss sehr begrenzt und ich weiß nicht ob mein code folgende Formel tätsachlich entspricht.

    Die Formel lautet: n!/(n-k)!

    // VariationenBerechnung.cpp : Diese Datei enthält die Funktion "main". Hier beginnt und endet die Ausführung des Programms.
    //
    
    // Berechnung Variationen ohne Wiederholung IMIT 08
    
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int fakultaet = 1;
        unsigned long long int n; // Anzahl der Vorhandenen Elemente
        long int k; // Anzahl der Vorhandenen Plätze
        unsigned long long int ergebnis;
    
    	cout << "Geben Sie die Anzahl der Vorhandene Elemente." << endl;
    	cin >> n;
    	cout << "Geben Sie die Anzahl der Vorhandene Plaetze, die zu belegen sind." << endl;
    	cin >> k;
    
    	k = n - k;
    
    	for (int i = n -1; i > 0; i--) {
    		n = n * i;	
    	}
    	
    	k = k * fakultaet;
    	
    	ergebnis = n / k;
    		
    		
    	
    	cout << "Das Ergebnis ist " << ergebnis << endl;
    
    	return 0;
    }
    


  • Dein k = k * fakultaet; ist immer k = k weil fakultaet mit 1 initialisiert wird und sich danach auch nicht ändert (und 1 das neutrale Element einer multiplikation ist ^^). Die for-Schleife passt und danach ist n = n!. Aber danach müsstest Du vor ergebnis = n / k; noch die Fakultät von k ausrechnen. Warum schreibst Du Dir nicht eine Funktion für die Fakultät?

    // Die Formel lautet n!/(n-k)!
    
    #include <iostream>
    
    using ull = unsigned long long;
    
    ull fak(ull value)
    {
    	if (value == 0)
    		return 1;
    
    	auto result{ value };
    	for (ull i{ 2 }; i < value; ++i)
    		result *= i;
    	return result;
    }
    
    int main()
    {
    	std::cout << "Geben Sie die Anzahl der Vorhandene Elemente ein: ";
    	ull n;
    	std::cin >> n;
    
    	std::cout << "Geben Sie die Anzahl der Vorhandene Plaetze, die zu belegen sind ein: ";
    	ull k;
    	std::cin >> k;
    
    	auto numerator = fak(n);
    	auto dendenominator = fak(n - k);
    	auto result = numerator / dendenominator;
    
    	std::cout << "Das Ergebnis ist " << result << '\n';
    
    	// return 0;  // kannst dir schenken. When control reaches the end of main() without encountering
                      // a return statement the effect is that of return 0;
    }


  • @Swordfish

    Hallo Swordfish,

    vielen lieben Dank für deine Hilfe!!! Ich hab einbsschn gebraucht bis ich verstanden habe was die Fakultät ist und wie man das berechnnet!




  • Global Moderator |  Mod

    Hier tatsächlich die Fakultäten auszurechnen ist keine gute Idee. Da ist man ganz schnell über den Wertebereich jedes Datentypens hinaus.

    Man überlege sich stattdessen beispielsweise, wie sich (n, k) zu (n, k-1) verhält, oder wie sich (n, k) zu (n-1, k-1) und (n-1, k) verhält. Dann klappt's auch für solch "große" Zahlen wie 13.



  • Schau mal hier: https://en.wikipedia.org/wiki/Binomial_coefficient
    (z.B. unter "Multiplicative formula")



  • Die Formel ist doch einfach alle Zahlen von n bis k multiplizieren...



  • @TGGC sagte in C++ Code Umsetzung für Mathe Formel n!/(n-k)! Aufgabe( Berechnung Variationen ohne Wiederholungen):

    Die Formel ist doch einfach alle Zahlen von n bis k multiplizieren...

    Nee ich denke nicht.
    Für n = 5 und k = 2 ist

    n! = 5! = 5 * 4 * 3 * 2 * 1
    (n-k)! = 3! = 3 * 2 * 1

    und wenn du n! durch (n-k)! teilst, dann kürzen sich 3, 2 und 1 raus und es bleiben 5 und 4.

    Ergo muss man alle Zahlen von n bis einschließlich n-k+1 multiplizieren.