binomialkoeffizent .. welcher datentyp??



  • Hallo Leute

    Ich habe die Aufgabe den binomialkoeffizent zweier zahlen zu errechnen.
    Zuerst habe ich die fakultät in einer headerdatei definiert und dann die rechnung sammt IO in der main.

    also so:

    main:

    #include<iostream>
    #include"./fakultaet.h"
    using namespace std;
    
    int main()
    {
    	/*
    
    	n!
    	--------
    	(n-k)!k!
    
    	*/
    	cout<<"Bitte Zahlen \"n\" und \"f\" eingeben: : "<<endl;
    	unsigned long int n;
    	unsigned long int k;
    	cin>>n;
    	cin>>k;
    
    	unsigned long int ergebnis_n = fakultaet(n);
    	unsigned long int ergebnis_k = fakultaet(k);
    	//unsigned long int ergebnis_bnf = fakultaet(n)/(fakultaet(n-k)*fakultaet(k));
    
    	cout<<"Ergebnis_n: "<<ergebnis_n<<endl;
    	cout<<"Ergebnis_k: "<<ergebnis_k<<endl;
    	//cout<<"Ergebnis_bnf ist: "<<ergebnis_bnf<<endl;
    }
    

    header:

    #include<iostream>
    using namespace std;
    
    unsigned long int fakultaet(unsigned long int zahl)
    {
    	if (zahl <= 1)
    	{
    		return 1;
    	}
    	return zahl * fakultaet(zahl-1);
    }
    

    Mein problem ist, das der Zahlenbereich anscheinend nocht ausreicht oder das sich irgendwelche zahlenwerte ueberschreiben.

    6 aus 49 kann ich gar nicht ausrechnen lassen.. dann kommt 0 raus.
    was mache ich falsch??



  • Das ist klar, weil die Fakultät auf 49 sehr sehr groß ist.
    Auf jeden Fall solltest du "long double" benutzen das ist der größte vom Standard definierte Typ. Wenn der Wertebereich auch da noch zu klein ist, dann musst du auf spezielle Bibliotheken für große Zahlen zurückgreifen (z.B. GMP).

    Dann kannst du das ganze optimieren indem du Zähler und nenner kürzt. Die Darstellung als Binomialkoeffizient ist zwar platzsparend, aber zum Ausrechnen weniger geeignet.
    Bei "49 über 6" hast du im Zähler nur noch "49*48*47*46*45*44" stehen und im Nenner "1*2*3*4*5*6". Das ist schonmal deutlich kleiner.



  • Es kommt immer drauf an, nach welchem Verfahren man den Binominalkoeffizienten berechnet. Wenn Du diese Methode benutzt:

    int binokoeff( int n, int k )
    {
        int erg = 1;  // 1: n über 0
        for( int i = 0; i < k; ++i )
            erg = erg * (n - i) / (i + 1);
        return erg;
    }
    

    kommt auch bei

    int lotto = binokoeff( 49, 6 );
    

    korrekt 13983816 heraus. Da reicht noch ein einfaches int (32Bit).

    Gruß
    Werner


Anmelden zum Antworten