(* The Great Win32 Language Shootout http://dada.perl.it/shootout/
contributed by Isaac Gouy (Modula2 novice)
To build: xc =m sieve
To run: sieve 900
*)
MODULE Sieve;
<* m2extensions + *>
<* checkindex - *>
<* coverflow - *>
(* Prefer unqualified procedures *)
FROM LanguageShootout IMPORT N;
FROM STextIO IMPORT WriteString, WriteLn;
FROM SWholeIO IMPORT WriteCard;
FROM SYSTEM IMPORT ADR, FILL;
CONST
start = 2;
stop = 8192;
TYPE Boolean_Array = ARRAY [start..stop] OF BOOLEAN;
VAR
array_size: CARDINAL;
n, count, i, k: CARDINAL;
isPrimeNumber: Boolean_Array;
BEGIN
n := N();
array_size := SIZE(Boolean_Array);
WHILE n > 0 DO
DEC(n);
count := 0;
(* Set all the isPrimeNumber array to TRUE *)
FILL( ADR(isPrimeNumber), TRUE, array_size );
FOR i := start TO stop DO
IF isPrimeNumber[i] THEN
INC(count);
k := i+i;
WHILE k <= stop DO
isPrimeNumber[k] := FALSE;
INC(k, i);
END;
END;
END;
END;
WriteString("Count:"); WriteCard(count,0); WriteLn;
END Sieve.