home *** CD-ROM | disk | FTP | other *** search
- 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.