Fakulität berechnen

  • C++

  • fireyoutz
  • 15350 Aufrufe 13 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Fakultät berechnen

    Hi Leute!
    hier mal wieder ne Aufgabe in C++ wo ich leider nicht weiter komm. Es liegt weniger an meinen Programierkenntnissen sonder eher daran dass ich die Fakulität einer Zahl an sich nicht so wirklich verstehe. (Bin voll die Pfeife in Mathe :D ) Hier die Aufgabe:

    Die Fakultät n! einer positiven Zahl n ist definiert durch:
    n!=1*2*3...*(n-1)*n
    Ferner ist: 0! = 1

    Schreiben Sie eine Funktion, die die Fakultät einer Zahl berechnet.

    Argument: Eine Zahl n vom Typ int
    Return-Wert: Die Fakultät n! vom Typ double.

    Formulieren Sie zwei Versionen der Funktion:

    -mit Hilfe einer Schleife
    -rekursive Berechnung


    Soooooo...
    Jetzt meine eigentliche Frage:
    Wie berechne ich so eine Fakultät für die Zahlen 1 - 9 in einer Funktion??
    in der main soll die Funktion für die Berechnung 10 mal aufgerufen werden.
    --> also wie berechne ich z.b. die Fakultät von 7 mit einer For-Schleife??

    Wär cool wenn mir jemand helfen könnte! Ich weis einfach nicht wie der Code für die Fakultät aussehen soll! Wenn noch fragen da sein sollten einfach fragen!
    greatings fireyoutz
  • n! ist das Produkt aller nat. Zahlen von 1 bis n. Also 4! ist 1*2*3*4, also 24.

    Zu lösen per for-Schleife, in etwa so:

    PHP-Quellcode

    1. unsigned long faculty = 1;
    2. for (unsigned int i = 2; i <= x; i++)
    3. faculty *= i;

    faculty ist das Ergebnis, die Variable x soll hier mal die Zahl sein, deren Fakultät du errechnen willst.
    Da Fakultäten sehr schnell sehr groß werden können, hab ich mal unsigned long als Datentyp genommen.

    edit:
    Rekursive Berechnungen kann ich nicht leiden. Sind was für Unix Freaks. ;)
  • Rekursiv säh es z.B. so aus:

    Quellcode

    1. int faculty(int nNum, int nIndex, int nTemp){
    2. if(!nTemp) nTemp = 1;
    3. nTemp *= ++nIndex;
    4. if(nIndex == nNum) return nTemp;
    5. return faculty(nNum, nIndex, nTemp);
    6. }


    nNum = der Zahl von der du Fakultät haben willst
    nIndex sollte bei aufruf der Funktion 0 sein
    nTemp sollte bei aufruf der Funktion 0 oder 1 sein
  • ok vielen dank jungs... noch eine noobige frage. wie heißt dieser operator nochmal und was bewirkt er?: *=
    ich habs schonmal gewusst aber noch nie groß damit gearbeitet...
    thx
    fireyoutz
  • Na ganz einfach, var1 X= var2 ist ne Abkürzung für var1 = var1 X var2.

    X kann sein: +, -, *, /, ^ (xor), & (and), | (or), % (modulo)

    xor, and und or sind sozusagen die drei bitweisen Grundrechenarten (bitte extern informieren falls notwendig), Modulo ist der Rest einer Division, also 8 % 3 = Rest von 8 durch 3 also = 2.
  • Also wenn man alles ausschreibt:

    Quellcode

    1. int faculty(int nNum, int nIndex, int nTemp){
    2. if(nTemp == 0) nTemp = 1;
    3. nIndex = nIndex + 1;
    4. nTemp = nTemp * nIndex;
    5. if(nIndex == nNum) return nTemp;
    6. return faculty(nNum, nIndex, nTemp);
    7. }
  • Hallo Leute! Wollte mal fragen ob jemand mir vielleicht ein paar Verbesserungsvorschläge hat oder ob die Lösung recht elegant ist. Wär net wenn ein "Freak" seine Meinung posten könnte! :D
    Thx schonmal ;)

    PHP-Quellcode

    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4. double rechner(int, double);
    5. int main()
    6. {
    7. int i=1;double erg=1;
    8. cout<<"Dieses Programm berechnet die Fakultaet von 1-9"<<endl;
    9. for(i=1;i<=9;i++)
    10. {
    11. rechner(i,erg);
    12. cout<<rechner(i,erg)<<endl;
    13. erg=rechner(i,erg);
    14. }
    15. getch();
    16. }
    17. double rechner(int i,double erg)
    18. {
    19. erg*=i;
    20. return erg;
    21. }
    Alles anzeigen
  • mein vorschlag

    PHP-Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. int rechner(int);
    4. void main()
    5. {
    6. cout<<"Dieses Programm berechnet die Fakultaet von 1-9"<<endl;
    7. int i;
    8. for(i=1;i<=9;i++)
    9. {
    10. cout<<rechner(i)<<endl;
    11. }
    12. }
    13. int rechner(int i)
    14. {
    15. int result =1;
    16. while(i!=1)
    17. {
    18. result *= i;
    19. i--;
    20. }
    21. return result;
    22. }
    Alles anzeigen



    deinen double wert erg kannste dir sparen, der wert wird immer ein int sein, und wozu übergibst du 2 variablen an rechner? brauchste ja nicht



    aber richtig ist deins.. :)

    bis auf das deine main fkt nix zurück gibt..
  • @beast: vielen dank für deine antwort! mit dem double wert geb ich dir vollkommen recht! :löl:

    die i und die erg übergeb ich halt dass ich nicht nochmal welche deklarieren muss im rechner... :confused: im endeffekt ises doch egal oder??

    @clonk: ebenfalls vielen dank! die möglichkeit wollt ich am anfang mit einbringen aber dann is mir aufgefallen dass der user in dieser aufgabenstellung keine eingabe machen soll ;)
    trotzdem danke für den tipp! is ne schnelle einfache Lösung!

    greetings
    fireyoutz
  • die i und die erg übergeb ich halt dass ich nicht nochmal welche deklarieren muss im rechner... im endeffekt ises doch egal oder??


    PHP-Quellcode

    1. for(i=1;i<=9;i++)
    2. {
    3. rechner(i,erg);
    4. cout<<rechner(i,erg)<<endl;
    5. erg=rechner(i,erg);
    6. }
    7. getch();
    8. }



    dann kannst du dir aber das rechner(i,erg); sparen weil er nicht weiss wohin er denn jetzt die variable zurückgeben soll, damit er die z.b an was anderes übergibt müsstest du schreiben
    int wasanderes = rechner(i,erg); z.b.
    klar was ich dir damit sagen will ? ;)
    bei cout z.b berechnet er ja gleich rechner(i,erg) und das was die fkt zurückliefert schreibt er gleich mit cout raus. das erste rechner(i,erg) ist somit unnütz =)

    noch ein vorteil daran das du sie in der fkt selber deklarierst seh ich in der übersichtlichkeit, da ist es halt schön gekapselt, ich geb der rechner fkt. einfach die zahl an für die er die fakultät rechnen soll und er gibt mir das ergebnis zurück.



    clonks methode kannste genauso nehmen, müsstest halt noch ne while oder for schleife drumrumbauen damit du nur die zahlen von 1-9 berechnest.. ;)
  • Naja nur dann würde man eher schreiben:

    PHP-Quellcode

    1. inline int rechner(int i)
    2. {
    3. int r = 1;
    4. while (i != 1)
    5. r *= i--;
    6. return r;
    7. }


    So und das mit deinem Ergebnis müsste man so machen:

    PHP-Quellcode

    1. int main()
    2. {
    3. [...]
    4. int ergebnis = 1;
    5. rechner(i, ergebnis);
    6. cout << "Ergebnis: " << ergebnis << "\r\n";
    7. [...]
    8. }
    9. inline int rechner(int i, int &erg)
    10. {
    11. while (i != 1)
    12. erg *= i--;
    13. }
    Alles anzeigen

    Dieses & vor dem erg hat zur Folge, dass der Compiler diese Variable nicht kopiert, sondern die selbe Variable wieder verwendet, welche du vorher übergeben hast. Kurz gesagt, dieses "erg" in der rechner-Funktion ist die selbe Variable wie das "ergebnis" der main-Funktion. Gibt man das & nicht an, wären die Variablen unterschiedlich, sie hätten nur den selben Ausgangswert. Somit wirken sich Veränderungen an "erg" auch auf "ergebnis" aus, wenn du das & angibst.
    inline bedeutet übrigens, dass die Funktion rechner direkt in die main-Funktion hinein geschrieben wird (vom Compiler). Bei solch kurzen Funktionien würde ich das empfehlen, aus Performance-technischen Gründen. ;)
  • und ich hab mich schon gefragt wann mg-tx wieder mal performance code ins board bringt ^^ und schon isser da.. *g*

    vielleicht sollten wir gleich versuchen einen einzeiler aus der ganzen fkt zu machen :D
  • hehe beast!:D
    vielen dank mg tx des is definitiv sau kurz :D
    k da die erste aufgabe nun kräftig durchgekaut wurde hier noch ein Lösungsvorschlag zur rekursiven Variante. Nur für die dies interesiert.
    und noch Danke an alle die hier mithelfen!!
    greetings fireyoutz

    PHP-Quellcode

    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4. int rechner (int);
    5. int main()
    6. {
    7. int n;
    8. cout<<"Dieses Programm berechnet ihnen die Fakultaet von 1-9 "<<endl;
    9. cout<<"Bitte geben Sie eine Zahl von 1-9 ein: ";cin>>n;
    10. cout<<rechner(n)<<endl;
    11. getch();
    12. }
    13. int rechner (int n)
    14. {
    15. if(n>1)
    16. return n * rechner (n-1);
    17. else return 1;
    18. }
    Alles anzeigen