MODULE SelfDescribingNumber; FROM WholeStr IMPORT CardToStr; FROM STextIO IMPORT WriteString, WriteLn; FROM SWholeIO IMPORT WriteCard; PROCEDURE Check(Number: CARDINAL): BOOLEAN; VAR I, D: CARDINAL; A: ARRAY [0 .. 9] OF CHAR; Count, W: ARRAY [0 .. 9] OF CARDINAL; Result: BOOLEAN; BEGIN CardToStr(Number, A); FOR I := 0 TO 9 DO Count[I] := 0; W[I] := 0; END; FOR I := 0 TO LENGTH(A) - 1 DO D := ORD(A[I]) - ORD("0"); INC(Count[D]); W[I] := D; END; Result := TRUE; I := 0; WHILE Result AND (I <= 9) DO Result := (Count[I] = W[I]); INC(I); END; RETURN Result; END Check; VAR X: CARDINAL; BEGIN WriteString("Autodescriptive numbers from 1 to 100000000:"); WriteLn; FOR X := 1 TO 100000000 DO IF Check(X) THEN WriteString(" "); WriteCard(X, 1); WriteLn; END; END; WriteString("Job done."); WriteLn; END SelfDescribingNumber.