
Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/lokiware.info/mff/wakka.php on line 35
{	Pocitame 'e' na libovolny zadany pocet mist pomoci rady
	e = 1/0! + 1/1! + 1/2! + ... }

program E_E_e_E_E_e_e_EEE;

uses Crt;

const MaxDelka = 60;
const Soustava = 10;

type
	{ [0] uklada celou cast pred desetinnou carkou, dalsi cifry jsou cifry
		za desetinnou carkou. }
	TCislo = array [0..MaxDelka] of integer;

{ ===================================================================================== }

procedure NoveCislo ( var n : TCislo );
var
	i : integer;

begin
	for i := 1 to MaxDelka do n[i] := 0;
end;

{ ===================================================================================== }

procedure NactiCisloZeStringu ( var n : TCislo; s : string );
var
	i, PoziceCarky : integer;
	PredCarkou : string;

begin
	PoziceCarky := Pos('.', s);
	PredCarkou := Copy(s, 1, PoziceCarky-1);
	Val(PredCarkou, n[0], i);

	for i := 1 to Length(s)-PoziceCarky do n[i] := Ord(s[PoziceCarky+i])-Ord('0');
	for i := Length(s)-PoziceCarky+1 to MaxDelka do n[i] := 0;
end;

{ ===================================================================================== }

procedure VypisCislo ( var n : TCislo );
var
	i, PosledniNenula	: integer;

begin
	PosledniNenula := 1;
	for i := 1 to MaxDelka do
		if n[i] <> 0 then PosledniNenula := i;

	Write(n[0], '.');
	for i := 1 to PosledniNenula do Write(n[i]);
end;

{ ===================================================================================== }

{ A := A + B; }

procedure Pricti ( var A, B : TCislo );
var
	i, Zbytek, NovyZbytek : integer;

begin
	Zbytek := 0;
	for i := MaxDelka downto 0 do
	begin
		NovyZbytek := (A[i] + B[i] + Zbytek) div Soustava;
		A[i] := (A[i] + B[i] + Zbytek) mod Soustava;
		Zbytek := NovyZbytek;
	end;

	if Zbytek <> 0 then WriteLn('!!! Preteceni rozsahu cisla ve funkci Pricti().');
end;

{ ===================================================================================== }

{ A := B / C }

procedure Vydel ( var A, B : TCislo; C : longint);
var
	i : integer;
  n : longint;

begin
	n := 0;
	for i := 0 to MaxDelka do
	begin
		n := n*Soustava + B[i];
		A[i] := n div C;
		n := n - A[i]*C;
	end;
end;

{ ===================================================================================== }
{ ===================================================================================== }
{ ===================================================================================== }

var
	i, N : longint;
	E, PrevracenyFaktorial : TCislo;

BEGIN
	ClrScr;
	WriteLn('Vyjadrujeme konstantu "e" pomoci limity Sum(1/n!).');
 	Write('Zadejte n: '); ReadLn(N);
	WriteLn;

	NactiCisloZeStringu(E, '0.0');
	NactiCisloZeStringu(PrevracenyFaktorial, '1.0');

	for i := 0 to N do
	begin
		if i > 1 then Vydel(PrevracenyFaktorial, PrevracenyFaktorial, i);
		Pricti(E, PrevracenyFaktorial);
	end;

	WriteLn('2.7182818284590452353602874713526624977572470936999595749669676277240766303535');
	VypisCislo(E);
	ReadLn;
END.
