Fakultät n über k

Thomas44

Grünschnabel
Hallo, ich habe ein Programm geschrieben aber es funktioniert nicht, kann mir jemand behilflich sein?

C:
#include <stdio.h>

int main() {

    int n;
    int k;


    int fac ( int n ) {
        int fac_n = 1;
    for(int i = 2; i <= n; i = i+1)
        fac_n = fac_n * i;
    return fac_n; }

    int nk = fac( n ) / (fac( k ) * fac( n - k ));



    return 0;
}
 
aber es funktioniert nicht, kann mir jemand behilflich sein?
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung!

Ein paar Anmerkungen zu deinem Code:

1) Du definierst eine Funktion (fac) in einer Funktion (main). Das ist falsch. Du musst die Funktion außerhalb von main() definieren.

2) Bitte formatiere doch den Code ordentlich. So versteht man ja gar nix.

3) Warum i = i+1 und nicht einfach i++?

4) Du versuchst einen int nk zu berechnen, indem du die ints n und k in deine Funktion fac einsetzt. Aber n und k sind doch gar nicht definiert. Du musst deine Variablen initialisieren bevor du sie benutzen kannst!

5) Das Programm hat gar keine Ausgabe, also was bringt dir das alles?

Hier ist der Code etwas schöner formatiert:
C:
#include <stdio.h>

int fac(int n)
{
    int fac_n = 1;
   
    for(int i = 2; i <= n; i++)
        fac_n = fac_n * i;
   
    return fac_n;
}

int main()
{
    int n;
    int k;
   
    // WAS SOLLEN n UND k SEIN?

    int nk = fac( n ) / (fac( k ) * fac( n - k ));

    return 0;
}


Noch eine Anmerkung zur Berechnung des Binomialkoeffizienten:
Du versuchst hier die Berechnung über die Fakultätsfunktion, was ja auch ziemlich genau der mathematischen Definition entspricht. Allerdings wächst die Fakultätsfunktion sehr schnell an. Da Computer nur begrenzten Speicher haben - auch in den Registern - werden dir deine 64-Bit Integer schnell um die Ohren fliegen (Overflow). Die gute Nachricht ist, es gibt viele andere Berechnungsmethoden, die wesentlich stabiler sind. Ein Beispiel hierfür findest du sogar in der Wikipedia:

https://de.wikipedia.org/wiki/Binomialkoeffizient#Algorithmus_zur_effizienten_Berechnung
Ich würde an deiner Stelle zumindest mal auf deren Implementierung zurückgreifen. Unter Umständen willst du ja auch später noch auf BigInteger umsteigen, denn auch (n | k) steigt schnell auf verdammt große Zahlen an.

Gruß Technipion
 
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung!
Genau.
Ich möchte dich hiermit verwarnen, keine weiteren Threads ohne Nennung der Programmiersprache (C oder C++?), Fehlermeldung, Eigenansätze/-recherche und einer Beschreibung, warum diese unzureichend sind, zu posten. All diese Kriterien hast du in diesem älteren Thread und in dem hiesigen Thread missachtet. In beiden Threads hat man dich auch bereits darauf hingewiesen. Wenn du noch einmal dagegen verstößt, sehe ich mich gezwungen, den erstellten Thread dann solange zu deaktivieren, bis du ihn überarbeitest.
 
Was funktioniert nicht? Was soll der Code bewirken? Was kommt als Result? Oder kommt ein Fehler, wenn ja, mit welcher Fehlernummer und Meldung?

Du kannst uns helfen dir zu helfen.
 
Zurück