// lang_fak.cc
// Fakultaetsberechnung mit Langzahlen:
// Compilation mit:  g++ lang_fak_rec.cc -lgmpxx -lgmp
#include <gmpxx.h>
#include <iostream>
#include <iomanip>
using namespace std;

typedef mpz_class Int;

template <class T>
T fak (T i) {
  if ( i <= 1 ) return 1;
  return i * fak( T(i - 1) );
}

// rekursives Template compiliert nicht ohne inneren Cast vor i-1,
// siehe gmp-Manual chap. 12.6, C++-Interface Limitations

// Interessant hier die Eingabe i = 10000.

int main() {
  unsigned int i; Int k;
  while(1) {
    cout << "Eingabe : ";
    cin  >> i;
    cout << "Fuer long long   : ";
    cout << i << "! = "  << fak( (unsigned long long)   i) << "\n";
    cout << "Fuer long double : ";
    cout << i << "! = " << fak( (long double) i) << "\n";
    cout << "Fuer Int         : ";
    cout << i << "! = "  << fak ( (Int) i )      << "\n";
  }
}
