Also das gleiche problem gabs schon mal, allerdings wurde es objektorientiert gelöst. Ich habe einen Ansatz der nicht objekt orientiert ist. Ich glaube er funktioniert fast, aber in der ausgabe schreibt er mist. Das Programm soll bis 100! rechnen. Addieren muss es nicht können. Nur von beliebigen zahlen die fakultät berechnen und ausgeben. Ich habe ziemlich viel kommentiert und auch testausgaben eingebaut. Das Programm wird euch in sachen Speicher- und Rechenzeit bedarf bestimmt belustigen, da viel unnötiges gamacht wird, aber darauf kam es in der aufgabe nicht an. Ich danke für eure geduld. Hier mein Quellcode:
C++:
#include <iostream>
using namespace std;
int main()
{
int zahl[1000][2],v,w,x,n;
cout <<"Exakte berechnung grosser Fakultaet"<<endl;
cout <<"----------------------------------"<<endl;
cout <<"Bitte geben Sie das n zu berechnende Fakultaet(n) ein:" << endl;
cin >> n;
//Das int Feld zur berechnung der Fakultät ist 1000 zeichen lang, die zweite zeile ist ein hilfsfeld
//zum Zwischenspeichern, n ist die Zahl, deren Fakultät berechnet werden soll
//v,w und x sind die 1. 2. und 3. Ziffer des ergebnisses für die aktuelle Fakultät * Eintrag des Zeichens
//in der aktuellen Spalte
zahl[0][0]=1;
zahl[0][1]=1;
//Die erste Spalte wird auf Null initialiesiert, als neutrales Element der späteren Multiplikation
for (int i=1; i<1000; i++)
{
zahl[i][1]=-1;
zahl[i][0]=-1;
}
//Alle anderen Spalten werden auf -1 initialisiert, um Abfragen zu können wo die Zahl endet
//Damit nicht erst mal z.B 950 nullen ausgegeben werden
for (int i=1; i<=n; i++)
//Es müssen alle Zahlen im bereich von 1 bis n einmal mit dem vorherigen Wert multipliziert
//werden. Beispiel 5! (!=Fakultät) = 1*2*3*4*5 = 120
{
for (int j=0; j<1000; j++)
//Hier wird jeder Eintrag des Feldes auf gültigkeit überprüft und anschließend mit dem aktuellen
//i multipliziert. BSP Im Feld Steht 120, i=6
//__0*6 = 0
//_20*6 = 120
//100*6 = 600
{
if ((zahl[j][0])>0)
{
v=(zahl[j][0])*i;
w=v-(v%10);
x=w-(w%100);
}
//Hier werden die Ergebnisse in ihre einzelnen Ziffern aufgeteit. Bsp.:120 v=0, w=20, x=100
if ((zahl[j][1])>0)
zahl[j][1]= (zahl[j][1]) + v%10;
else
zahl[j][1]= v%10;
//Es wird geprüft ob an der stelle 10^0 schon etwas steht größer als 0, wenn ja wird das neue ergebnis
//zum alten dazuaddiert, wenn nicht wird der alte wert (also -1) durch den neuen ersetzt
if ((zahl[(j+1)][1])>0)
zahl[(j+1)][1]=(zahl[j+1][1])+((w%100)/10);
else
zahl[(j+1)][1]=(w%100)/10;
//Es wird geprüft ob an der stelle 10^1 schon etwas steht (z.B übertrag von der vorherigen abfrage)
//größer als 0, wenn ja wird das neue ergebnis zum alten dazuaddiert,
//wenn nicht wird der alte wert durch den neuen ersetzt
if ((zahl[(j+2)][1])>0)
zahl[(j+2)][1]= (zahl[j+2][1]) + ((x%1000)/100);
else
zahl[(j+2)][1]=(x%1000)/100;
//Es wird geprüft ob an der stelle 10^2 schon etwas steht größer als 0, wenn ja wird das neue ergebnis
//zum alten dazuaddiert, wenn nicht wird der alte wert durch den neuen ersetzt. Da das Programm bis
//100! funktionieren soll ist dieser Schritt nötig, da 9*100 schon 900 ist also 3 stellen
}
for (int k=1; k<=1000; k++)
zahl[k][0]=zahl[k][1];
//Wenn alle berechnungen durchgeführt wurden, wird die Hilfzeile in die hauptzeile kopiert
}
cout << "Die exakte Fakultaet n! fuer n=" << n << " betraegt:" << endl;
//Sind alle multiplikationen durchgeführt wird der Inhalt der einzelnen Elemente darauf überprüft
//ob sie nicht mehr negativ sind, und werden dann in umgekehrter reihenfolge ausgegeben
for (int i=1000; i>=0; --i)
{
if ((zahl[i][0])>=0)
cout << zahl[i][0];
else
cout << "";
}
cout << endl;
cout << zahl[0][0] << endl;
cout << zahl[1][0] << endl;
cout << zahl[2][0] << endl;
cout << zahl[3][0] << endl;
cout << zahl[4][0] << endl;
cout << zahl[5][0] << endl;
cout << zahl[6][0] << endl;
cout << zahl[7][0] << endl;
cout << zahl[8][0] << endl;
cout << zahl[9][0] << endl;
cout << zahl[10][0] << endl;
cout << endl;
cout << zahl[100][0] << endl;
//Eine test ausgabe, damit ich sehe was einzelne felder machen
//Wie kommen in einzelne elemente des feldes zahlen mit mehr als einer ziffer?
//Und woher kommem die höheren einträge z.b 227 im 100 element bei 20!
cin >> n;
//Eingabe nur zum Ansehen des Ergebnisses
}
Zuletzt bearbeitet: