{$N+,E+}
program e20000;
uses Crt;
label 1,2;
var i,k,l,m,n,p,q,s:integer;
    c:word;
    a,b,e:array[0..20011] of byte;
    ch:char;
    filename:string[14];
    aa:text;
procedure y(x:longint);
var   i,yy:longint;
      a,xx,lf:double;
begin
i:=1; lf:=0; a:=ln(10); xx:=x+ln(3)/a;
repeat
  i:=i+1;
  lf:=lf+ln(i)/a
until
  lf>xx;
yy:=i-1; m:=yy;
end;
begin
  Clrscr;
1:for i:=1 to 7 do writeln;
  Textcolor(10);
  writeln('                         ВЫЧИСЛЕНИЕ ЧИСЛА   e ');
  writeln; writeln;writeln;
  Textcolor(9);
  write('с какой точностью? - введите необходимое число десятичных знаков (до20000):');
  Textcolor(12);
  readln(l);
  Textcolor(10);
  writeln;writeln;
  writeln('    необходимое число членов ряда в формуле Тейлора (M) брать автоматически,');
  writeln('    или задавать его "вручную"?');
  writeln;
  write('        (y/n)   ( y - "автоматически",  n - "вручную", с клавиатуры) :');
  Textcolor(12);
  readln(ch);
  y(l);
  if ch='y' then
  begin
    writeln;
    if l<200 then
      k:=m+10
    else k:=trunc(1.05*m);
    writeln(' минимальное допустимое  M:    M =',m:6,',  вычисления проводятся c  M =',k:6);
    goto 2
  end;
  writeln;writeln;
  writeln('минимально допустимое  M:    M = ',m:6,', рекомендуентся брать несколько большее');
  for i:=1 to 4 do writeln;
  Textcolor(9);
  write('     введите число членов ряда в формуле Тейлора: ');
  Textcolor(12);
  write('M =');
  readln(m);
2:for i:=1 to 5 do writeln;
  Textcolor(13);
  write('     через сколько знаков делать пробел ?  ( от 3 до 12 ) --> введите: ');
  Textcolor(10);
  readln(q);
  if (l>20000)or(l<2)or(m>20000)or(m<2)or(q>12)or(q<3) then
  begin
    Clrscr;
    writeln;
    Textcolor(28);
    writeln('    повторите ввод параметров ! ');
    goto 1
  end;
  Clrscr;
  writeln;writeln;
  l:=l+11;
  Textcolor(28);
  writeln('      ИДЕТ СЧЕТ: вычисление числа   e    с ',l-11:5,' знаками');
  e[0]:=1; b[0]:=1;
  for i:=1 to l-1 do
  begin a[i]:=0; b[i]:=0; e[i]:=0
  end;
  for n:=1 to m do
  begin for i:=0 to l-1 do a[i]:=b[i]; c:=a[0];
    for i:=0 to l-1 do
    begin b[i]:=c div n;
      c:=(c-n*b[i])*10+a[i+1]
    end;
    p:=0;
    for i:=l-1 downto 0 do
    begin c:=e[i]+b[i]+p;
      p:=0;
      if c<10 then e[i]:=c
      else
      begin
        e[i]:=c-10; p:=1
      end
    end
  end;
  Clrscr;
  Textcolor(10);
  writeln;
  if q<5 then s:=60 else s:=72;
  if q>10 then s:=84;
  write('2.');
  for i:=1 to l-11 do
  begin
    if i mod ((s div q -1)*q) <> 0 then
    begin write(e[i]:1);
      if i mod q = 0 then write(' ')
    end
    else
    begin
      writeln(e[i]:1); write('  ')
    end
  end;
  writeln;writeln;
  Textcolor(12);
  writeln('  НАЖМИТЕ  "ENTER"');
  readln;
  Clrscr;
  for i:=1 to 10 do writeln;
  Textcolor(9);
  write('    записать результат в файл ?   (y/n)   ');
  readln(ch);
  if ch='y' then
  begin
    writeln;writeln;
    Textcolor(10);
    write('   название файла для записи:  ');
    Textcolor(13);
    readln(filename);
    assign(aa,filename);
    rewrite(aa);
    writeln(aa,'            Число    e     c' ,l-11:5,' знаками');
    writeln(aa,'  (вычислено с учетом',m:4,'  членов ряда в формуле Тейлора');
    writeln(aa);
    write(aa,'2.');
    for i:=1 to l-11 do
    begin
      if i mod ((s div q -1)*q) <> 0 then
      begin write(aa,e[i]:1);
        if i mod q = 0 then write(aa,' ')
      end
      else
      begin
        writeln(aa,e[i]:1); write(aa,'  ')
      end
    end;
  Close(aa);
  end;
  Textcolor(10);
end.

