/*
Obliczenie silni.
Rekurencja.






















*/
#include <iostream>
#include <iomanip>
#include <limits>

//using namespace std; // w starszych kompilatorach trzeba zakomentować ten wiersz

long double silnia(unsigned short x);

int main()
  {
   for(;;)
     {
      cout<<"Podaj liczbe (0-koniec) : ";
      unsigned short X;
      cin>>X;
      if(cin.good())
        {
         if(!X) break;
         cout.setf(ios::fixed);
         cout<<X<<"!="<<setprecision(0)<<silnia(X)<<endl;
        }
      else
        {
         cin.clear();
         cout<<"Blad wprowadzenia"<<endl;
        }
      cin.ignore(INT_MAX,'\n');
     }
   return 0;
  }

long double silnia(unsigned short x)
  {
   if(x>1754) return 0; // i tak dlia 1755 policzy nie prawidłowo - przepelnienie
   if(x<2) return 1;
   if(x<3) return 2;
   return silnia((short)(x-1))*x;
  }
