Contributor: SWAG SUPPORT TEAM        

PROGRAM Fact;
{************************************************
* FACTOR - Lookup table demonstration using the        *
* factorial series.                                                                      *
*                                               *
*************************************************}

{$N+,E+}     {Set so you can use other real types}
USES Crt,Dos,Timer;   { t1Start, t1Get, t1Format }
CONST
   BigFact = 500;  {largest factorial is for 1754}
TYPE   {defined type for file definition later}
    TableType = ARRAY [0..BigFact] OF Extended;
VAR
   Table : TableType;

{************************************************
* factorial - compute the factorial of a number        *
*                                               *
* INP:        i - the # to compute the factorial of        *
* OUT:        The factorial of the number, unless a        *
*                number greater than BIG_FACT or less      *
*                than zero is passed in (which results     *
*                in 0.0).                                  *
*************************************************}

FUNCTION Factorial(I: Integer): Extended;
VAR
   K : Integer;
        F : Extended;
BEGIN
        IF I = 0 THEN
                F := 1
        ELSE
       BEGIN
          IF (I > 0) AND (I <= BigFact) THEN
             BEGIN
                F := 1;
                FOR K := 1 TO I DO
                   F := F * K
             END
          ELSE
             F := 0
       END;
        Factorial := F
END;

{************************************************
* Main - generate & save table of factorials    *
*************************************************}

VAR
   I, J, N            : Integer;
   F                  : Extended;
   T1, T2, T3         : Longint;
   Facts              : FILE OF TableType;
BEGIN
        { STEP 1 - compute each factorial 5 times }
   ClrScr;
        WriteLn('Now computing each factorial 5 times');
        T1 := tStart;
        FOR I :=0 TO 4 DO
                FOR J := 0 TO BigFact DO
                        F := Factorial(J);              { f=j! }
        T2 := tGet;
        WriteLn('Computing all factorials from 0..n ');
        WriteLn('5 times took ',tFormat(T1,T2),
                ' secs.');
   WriteLn;
        { STEP 2 - compute the table, then look up
                                 each factorial 5 times.                        }
        WriteLn('Now compute table and look up each ',
                'factorial 5 times.');
        T1 := tStart;
        FOR I := 0 TO BigFact DO
                Table[I] := Factorial(I);
        T2 := tGet;
        FOR I := 0 TO 4 DO
                FOR J :=0 TO BigFact DO
                        F := Table[J]; { f=j! }
        T3 := tGet;
        WriteLn('Computing table took ',tFormat(T1,T2),
                ' seconds');
        WriteLn('Looking up each factorial 5 times to',
           'ok ',tFormat(T2,T3),' seconds');
        WriteLn('Total: ',tFormat(T1,T3),' seconds');
   WriteLn;
{STEP 3 - Compute each factorial as it is needed}
        WriteLn('Clearing the table,',
                ' and computing each ');
        WriteLn('factorial as it is needed',
                ' (for 5) lookups.');
   WriteLn;
        T1 := tStart;
        FOR I := 0 TO BigFact DO
                Table[I] := -1;            { unknown Val }
        FOR I := 0 TO 4 DO
                FOR J := 0 TO BigFact DO
           BEGIN
                        F := Table[J];
                        IF F < 0 THEN
                                BEGIN
                                  F := Factorial(J);
                        Table[J] := F    { F = J! }
                END
           END;
        T2 := tGet;
        WriteLn('Clearing table and computing each');
        WriteLn(' factorial as it was needed for 5');
   WriteLn('lookups took ',tFormat(T1,T2),
           ' secs.');
        { STEP 4 - write the table to disk (we are
     not timing this step, because if you are
     loading it from disk,        you presumably do not
     care how long it took to compute it.      }
   Assign(Facts,'Fact_tbl.tmp');
   Rewrite(Facts);
   Write(Facts,Table);
        Close(Facts);
        { Flush the disk buffer, so that the time
          is not affected by having the data in a
          disk buffer.                                                                }
        Exec('C:\COMMAND.COM','/C CHKDSK');
        { STEP 5 - read the table from disk, and
                                 use each factorial 5 times                }
        T1 := tStart;
   Assign(Facts,'Fact_tbl.TMP');
   Reset(Facts);
   Read(Facts,Table);
   Close(Facts);
        T2 := tGet;
        FOR I := 0 TO 4 DO
                FOR J :=0 TO BigFact DO
           F := Table[J];                 { f=j! }
        T3 := tGet;
        WriteLn('Reading the Table from disk took ',
                        tFormat(T1,T2),' seconds.');
        WriteLn('Looking up each Factorial 5 times ',
        'to ok took ',tFormat(T2,T3),' seconds.');
        WriteLn('Total: ',tFormat(T1,T3),' seconds.');
   WriteLn;
   WriteLn('Press Enter TO see the factorials');
   ReadLN;
   FOR I:=0 TO BigFact DO
      WriteLn('[',I,'] = ',Table[I]);
end.