e.p
上传用户:upcnvip
上传日期:2007-01-06
资源大小:474k
文件大小:2k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. $partial_eval on$
  2. program e(input,output);
  3. const
  4.    NDIGITS = 1007;
  5.    NPRINT = 1000;
  6. type
  7.    digit = 0..255;
  8.    digitarray = packed array [0..NDIGITS] of digit;
  9. var
  10.    s,x,t: ^digitarray;
  11.    xs,ts: integer;
  12.    i: integer;
  13. procedure initinteger(var x:digitarray; n:integer);
  14. var
  15.    i: integer;
  16. begin
  17.    x[0] := n;
  18.    for i := 1 to NDIGITS do x[i] := 0;
  19. end;
  20. procedure divide(var x:digitarray; xs,n:integer;
  21.                  var y:digitarray; var ys:integer);
  22. var
  23.    i: integer;
  24.    c: integer;
  25. begin
  26.    c := 0;
  27.    for i := xs to NDIGITS do begin
  28.       c := 10*c + x[i];
  29.       y[i] := c div n;
  30.       c := c mod n;
  31.    end;
  32.    ys := xs;
  33.    while (ys <= NDIGITS) and (y[ys] = 0) do ys := ys+1;
  34. end;
  35. procedure add(var s,x:digitarray; xs:integer);
  36. var
  37.    i: integer;
  38.    c: integer;
  39. begin
  40.    c := 0;
  41.    for i := NDIGITS downto xs do begin
  42.       c := s[i] + x[i] + c;
  43.       if c >= 10 then begin
  44.          s[i] := c - 10;
  45.          c := 1;
  46.       end else begin
  47.          s[i] := c;
  48.          c := 0;
  49.       end;
  50.    end;
  51.    i := xs;
  52.    while c <> 0 do begin
  53.       i := i-1;
  54.       c := s[i] + c;
  55.       if c >= 10 then begin
  56.          s[i] := c - 10;
  57.          c := 1;
  58.       end else begin
  59.          s[i] := c;
  60.          c := 0;
  61.       end;
  62.    end;
  63. end;
  64. procedure sub(var s,x:digitarray; xs:integer);
  65. var
  66.    i: integer;
  67.    c: integer;
  68. begin
  69.    c := 0;
  70.    for i := NDIGITS downto xs do begin
  71.       c := s[i] - x[i] + c;
  72.       if c < 0 then begin
  73.          s[i] := c + 10;
  74.          c := -1;
  75.       end else begin
  76.          s[i] := c;
  77.          c := 0;
  78.       end;
  79.    end;
  80.    i := xs;
  81.    while c <> 0 do begin
  82.       i := i-1;
  83.       c := s[i] + c;
  84.       if c < 0 then begin
  85.          s[i] := c + 10;
  86.          c := -1;
  87.       end else begin
  88.          s[i] := c;
  89.          c := 0;
  90.       end;
  91.    end;
  92. end;
  93. begin
  94.    new(s); new(x);
  95.    initinteger(s^,0);
  96.    initinteger(x^,1);
  97.    xs := 0;
  98.    add(s^,x^,xs);
  99.    i := 0;
  100.    repeat
  101.       i := i+1;
  102.       divide(x^,xs,i,x^,xs);
  103.       add(s^,x^,xs);
  104.       write(#M'Series: ',100*xs/(NDIGITS+1):5:2,'%');
  105.    until xs > NDIGITS;
  106.    writeln;
  107.    writeln('':45,'e = ',s^[0]:1,'.');
  108.    i := 0;
  109.    for i := 1 to NPRINT do begin
  110.       write(s^[i]:1);
  111.       if i mod 1000 = 0 then writeln;
  112.       if i mod 100 = 0 then writeln
  113.       else if i mod 10 = 0 then write(' ');
  114.    end;
  115.    writeln;
  116.    write('Final digits: ');
  117.    for i := NPRINT+1 to NDIGITS do begin
  118.       write(s^[i]:1);
  119.    end;
  120.    writeln;
  121. end.