# Fakultät für 100 berechnen



## Neuling 765 (11. Januar 2010)

Hallo zusammen ich brauche dringent hilfe beim Programieren. Ich bin im Programieren ein ziemlicher neuling und soll ein programm schreiben für die Exakte berechnung von n! und das für große n wie zB 100.

Die Vorgaben: 1. statt datentyp int eigenen datentyp zahl verwenden (beliebig lange positive ganzzahlige Dezimalzahlen).
                           2. für die implementierung ein Feld mit Läng 1000 oder aber strings mit Dezimalziffern verwenden.
                           3. für Datentyp zahl  soll man dan die Addition und Multiplikation implementieren, um damit in einer schleife n! zu berechnen.

bis jetzt kann ich zwar normle fakultäten mit int berechnen aber nicht bis 100.

Das hab ich bis jetzt:

int main()
{
cout << "Geben Sie eine Zahl ein: ";
int Zahl;
cin >> Zahl;
int x = Zahl-1;
int Res = Zahl;
  while (x > 1)
  {
  cout << Res << " * " << x << " = " << Res * x << endl;
  Res *= x;
  x--;
  }  
cout << "Die Fakultaet von " << Zahl << " ist: " << Res;
getch();
return 0;    
}


Ich hoffe man kan mir helfen... internet und bücher hab ich natürlich auch schon dürchgewühlt.
Danke schon mal im vorraus.

man da kommt man sich sehr dumm vor^^


----------



## saftmeister (11. Januar 2010)

Naja, das Problem ist mit C/C++ nicht so trivial, wie es zunächst aussehen mag. Du hast nämlich ein Problem: int ist signed 16 bit und hat damit einen Wertebereich von -2147483648 bis 2147483647. Damit kannst du AFAIK die Falkultät von 100 nicht berechnen. Etwas weiter kommst du, wenn du einen unsigned int daraus machst. Das reicht aber immer noch nicht. Selbst mit unsigned long long (2^64) kommst du da nicht hin. Die Fakultät von 100 ist sehr groß (158 Stellen). Das kannst du mit keinem primitiven Datentypen darstellen.

Du kannst es aber mit GMP machen, wenn das erlaubt ist.

Edit: Das nächste mal bitte Code-Tags für die entsprechende Sprache setzen. In deinem Falle [ code=cpp ]...[ /code ] (ohne leerzeichen). Liest sich dann besser.


----------



## deepthroat (11. Januar 2010)

Hi.





saftmeister hat gesagt.:


> Du kannst es aber mit GMP machen, wenn das erlaubt ist.


Der Lösungsweg ist doch bereits in der Aufgabenstellung vorgegeben:

Es soll ein eigener Datentyp implementiert werden. Für diesen Datentyp sind dann die Addition und Multiplikation zu definieren.

Gruß


----------



## saftmeister (11. Januar 2010)

Danke, hatte ich überlesen. Nunja, dann kann er wenigstens den Source von gmp anschauen, wie die das machen.


----------



## Vereth (13. Januar 2010)

Du sollst eine neue Klasse _zahl_ schreiben, die Methoden für das Addieren und Multiplizieren anbietet. Für die interne Zahlendarstellung verwendest du am besten ein _int_-Array; _short int_ reicht. In jedem Element des Arrays speicherst du dann eine Stelle der Zahl. Außerdem musst du dir noch merken, wieviele Stellen deine Zahl momentan hat. Und du brauchst natürlich auch eine Methode, mit der du deiner Zahl einen Wert zuweisen kannst. Den übergibst du dann als Ziffernstring. Zum Schluss brauchst du natürlich auch noch eine Methode, die dir die Zahl als Ziffernstring liefert, damit du sie auch ausgeben kannst. Die Deklaration sollte also so aussehen.

```
class zahl
{
  private:
  int stelle[1000];
  int laenge;
  
  public:
  zahl();
  zahl(string ziffern);
  zahl(zahl z); // Kopier-Konstruktor (optional, aber nützlich)
  zahl Add(zahl z); // Addieren
  zahl Mal(zahl z); // Multiplizieren
  void Set(string ziffern); // Setzen eines neuen Wertes
  string toString(); // Ausgeben des aktuellen Wertes
};
```
Und noch zwei Tipps:
1. Die Anzahl der Stellen des Resultates einer Addition ist so groß wie die Anzahl der Stellen der längsten Zahl oder eins mehr (bei Übertrag).
2. Die Anzahl der Stellen des Resultates eine Multiplikation ist so groß wie die Summe der Stellenanzahl von Multiplikand und Multiplikator oder eins weniger.
Damit kannst du überprüfen, ob du genügend Platz für das Ergebnis hast.

PS: und verwende bitte die Code-Tags cpp und /cpp (natürlich in eckige Klammern gesetzt).


----------



## Neuling 765 (19. Januar 2010)

Danke das hat mir etlich den richtigen denkanstoß gegeben...
proramm ist fertig


----------



## Jellysheep (19. Januar 2010)

Schön! 
Kannst du evtl. mal den Quellcode hier reinstellen?


----------

