C# Fakultät berechnen

moby07

Lieutenant
Registriert
Sep. 2007
Beiträge
899
Hallo zusammen,

kann mir jemand anhand eines Beispiels erklären, wie mit dieser Formel die Fakultät berechnet wird. Ich komme einfach nicht drauf.

Console.Write("Höchstgrenze:");
int Max = Convert.ToInt32(Console.ReadLine());
int Fakultaet = 1; //Vorbelegung mit 1 ist wichtig!!!
for (int i = 1; i <= Max; i++)
{
Fakultaet *= i;
}

Console.WriteLine("{0}! = {1}", Max, Fakultaet);


Gruß

moby07
 
Was Fakultät bedeutet weißt du? Dann ist es doch nicht weiter schwer, für beispielsweise 3! wird die 1 genommen, um 1 auf 2 erhöht und multipliziert, um 1 auf 3 erhöht und multipliziert, Abruchkritierium erreicht, und 1*2*3 = 6 ausgegeben. Fertig.
 
Ich hab nie C# programmiert, aber der Code ist ja recht einfach:
Er liest mit Console.ReadLine() eine Zeile ein, die die Zahl, bis zu der gerechnet werden soll, sein sollte. Da das ein String sein dürfte, wird dieser String mit "Convert.ToInt32" zu einer Integerzahl umgewandelt. Die Variable "Fakultaet" wird initialisiert.

Dann eine Schleife die folgendes macht: Die Variable i fängt bei eins an. Fakultät wird zu Fakultät mal i. Dann wird i um eins erhöht und das ganze geht von vorne los bis i größer als "Max", die anfänglich abgefragte Variable, wird.

Dann wird die Fakultät ausgegeben.

Aus Fakultät = 1*2*3*4*5*...*Max wird also:
Fakultät = 1*2
Fakultät = Fakultät*3 (was gleich Fakultät = 1*2*3 ist)
Fakultät = Fakultät*4 (was gleich Fakultät = 1*2*3*4 ist)
Fakultät = Fakultät*5 (was gleich Fakultät = 1*2*3*4*5 ist)
...
Fakultät = Fakultät*Max (was gleich Fakultät = 1*2*3*4*5*...*Max ist)
 
Also irgendwie ist mir der Ablauf in der Formel immer noch nicht klar. Vielleicht ist die Frage für manche trivial, aber wie sehen die einzelnen Schritte aus, damit ich nachher auf 6 bei 3! komme?
 
Die Formel steht doch in Wikipedia, sogar mit Beispielen darunter!

a3f33628f0aaa4f5af3376d21b1c7011.png

Beispiele:

332d9a4514d2583535e0617af4db6a3f.png
 
3! = 1 * 2 * 3 = 6

Das Programm macht folgendes:
Schritt 1: i = 1, Fakultät = 1
Schritt 2: i = 2, Fakultät_neu = Fakultät_alt * i = 1 * 2 = 2
Schritt 3: i = 3, Fakultät_neu = Fakultät_alt * i = 2 * 3 = 6

Fakultät als rekursiv definierte Funktion: f(n) = n * f(n-1), f(1) = 1.
 
@Yuuri

Die Formel ist mir schon klar. Nur wie das System es in einzelnen Schritten rechnet, das hätte ich gerne gewusst.

@Backslash

Aber das soll doch nicht so aussehen?:
Schritt 1: i = 1, Fakultät = 1
Schritt 2: i = 2, Fakultät_neu = Fakultät_alt * i = 1 * 2 = 2
Schritt 3: i = 3, Fakultät_neu = Fakultät_alt * i = 2 * 3 = 6
Schritt 4: i = 4, Fakultät_neu = Fakultät_alt * i = 3 * 4 = 12
 
Könnte man das auch so schreiben?


for (int i = 1; i <= 4; i++)
----------------------------
1. Durchgang
{
1= 1;
}
2. Durchgang
{
(1*2)2= 2;
}
3. Durchgang
{
(2*3)6= 3;
}
4. Durchgang
{
(6*4)24= 4;
}
----------------------------

Console.WriteLine("{0}! = {1}", Max, Fakultaet);
=
Console.WriteLine("{4}! = {24}", Max, Fakultaet);
 
Hast du dich denn überhaupt mit der Sprache an sich beschäftigt? Ich weiß nicht wirklich wo es bei dir klemmt... An der Sprache, an der Sache, an der Umsetzung, ... Es steht bereits alles im Thread, noch ausführlicher geht es kaum.
 
Mit der Sprache beschäftige ich mich erst seit ein paar Monaten. Doch an der "Fakultät" klemmt es gerade ein wenig. Ist denn meine "Erklärung" wenigstens soweit richtig oder wie würde man das besser erklären wollen/können?
 
Im Prinzip, nur würde ich es anders schreiben. Obige "Auflistung" ist eher konfus. Mach dir lieber eine Tabelle, wo du jede einzelne Variable auflistet, damit es auch übersichtlich bleibt.
Code:
i (= Durchgang) | Max | Fakultaet
----------------------------------
              1 |   4 |  1 (1 * 1)
              2 |   4 |  2 (1 * 2)
              3 |   4 |  6 (2 * 3)
              4	|   4 | 24 (6 * 4)
Du kannst auch mit dem Debugger arbeiten und Breakpoints setzen um somit den Inhalt der Variablen zu sehen.
 
Ich glaube die folgende Zeile ist mein Problem:

Fakultaet *= i;


Wie sieht diese Formel, um beim Beispiel zu bleiben, in vier Läufen jeweils aus?

Edit: Mich stört nämlich das "Fakultaet *". Wie ist der Bezug zu xy?
 
Zuletzt bearbeitet:
Ich weiß jetzt nicht was du mit xy meinst, aber:

Fakultaet *= i;

ist eine verkürzte Version von:

Fakultaet = Fakultaet * i;
 
r0b0t schrieb:
Fakultaet *= i;

ist eine verkürzte Version von:

Fakultaet = Fakultaet * i;

Genau das hat mich wuschig gemacht. Fakultät * Durchlauf kann ich erklären. Aber Fakultät * (gar nichts) = i; schon weniger.


Aufjedenfall sieht so meine inoffizielle Musterlösung (erstmal) aus:

for (int i = 1; i <= Max; i++)

{
Fakultaet = Fakultaet * i; //wie "Fakultaet *= i;"
}

Jede einzelne Schleife in Zahlen dargestellt (hier Fakultät von 5):
= 1 * i;
= 2 * i,
= 6 * i;
= 24 * i;
= 120 (Fakultät) * i (Durchlauf);

Console.WriteLine("{5}! = {120}", Max (Durchläufe), Fakultaet);

Edit: Bevor einer sich beschwert;), natürlich fehlt ein wenig Text. Das habe ich der Übersicht zur Gute weggelassen.
 
Zuletzt bearbeitet:
Es heißt übrigens wenn dann Console.WriteLine( "{0}! = {1}", 5, 120 );.
 
Hier stand Blödsinn.

Du hast Recht!:)
 
Zurück
Oben