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.
 

AltStyle によって変換されたページ (->オリジナル) /