111 lines
1.8 KiB
Text
111 lines
1.8 KiB
Text
MODULE BrazilianNumbers;
|
|
|
|
FROM STextIO IMPORT
|
|
WriteLn, WriteString;
|
|
FROM SWholeIO IMPORT
|
|
WriteInt;
|
|
|
|
VAR
|
|
C, N: CARDINAL;
|
|
|
|
PROCEDURE SameDigits(N, B: CARDINAL): BOOLEAN;
|
|
VAR
|
|
F: CARDINAL;
|
|
BEGIN
|
|
F := N MOD B;
|
|
N := N / B;
|
|
WHILE N > 0 DO
|
|
IF N MOD B <> F THEN
|
|
RETURN FALSE;
|
|
END;
|
|
N := N / B;
|
|
END;
|
|
RETURN TRUE;
|
|
END SameDigits;
|
|
|
|
PROCEDURE IsBrazilian(N: CARDINAL): BOOLEAN;
|
|
VAR
|
|
B: CARDINAL;
|
|
BEGIN
|
|
IF N < 7 THEN
|
|
RETURN FALSE
|
|
ELSIF (N MOD 2 = 0) AND (N >= 8) THEN
|
|
RETURN TRUE
|
|
ELSE
|
|
FOR B := 2 TO N - 2 DO
|
|
IF SameDigits(N, B) THEN
|
|
RETURN TRUE
|
|
END
|
|
END;
|
|
RETURN FALSE;
|
|
END
|
|
END IsBrazilian;
|
|
|
|
PROCEDURE IsPrime(N: CARDINAL): BOOLEAN;
|
|
VAR
|
|
D: CARDINAL;
|
|
BEGIN
|
|
IF N < 2 THEN
|
|
RETURN FALSE;
|
|
ELSIF N MOD 2 = 0 THEN
|
|
RETURN N = 2;
|
|
ELSIF N MOD 3 = 0 THEN
|
|
RETURN N = 3;
|
|
ELSE
|
|
D := 5;
|
|
WHILE D * D <= N DO
|
|
IF N MOD D = 0 THEN
|
|
RETURN FALSE
|
|
ELSE
|
|
D := D + 2;
|
|
IF N MOD D = 0 THEN
|
|
RETURN FALSE
|
|
ELSE
|
|
D := D + 4
|
|
END
|
|
END
|
|
END;
|
|
RETURN TRUE;
|
|
END
|
|
END IsPrime;
|
|
|
|
BEGIN
|
|
WriteString("First 20 Brazilian numbers:");
|
|
WriteLn;
|
|
C := 0; N := 7;
|
|
WHILE C < 20 DO
|
|
IF IsBrazilian(N) THEN
|
|
WriteInt(N, 1);
|
|
WriteString(" ");
|
|
C := C + 1;
|
|
END;
|
|
N := N + 1;
|
|
END;
|
|
WriteLn; WriteLn;
|
|
WriteString("First 20 odd Brazilian numbers:");
|
|
WriteLn;
|
|
C := 0; N := 7;
|
|
WHILE C < 20 DO
|
|
IF IsBrazilian(N) THEN
|
|
WriteInt(N, 1);
|
|
WriteString(" ");
|
|
C := C + 1;
|
|
END;
|
|
N := N + 2;
|
|
END;
|
|
WriteLn; WriteLn;
|
|
WriteString("First 20 prime Brazilian numbers:");
|
|
WriteLn;
|
|
C := 0; N := 7;
|
|
WHILE C < 20 DO
|
|
IF IsBrazilian(N) THEN
|
|
WriteInt(N, 1);
|
|
WriteString(" ");
|
|
C := C + 1;
|
|
END;
|
|
REPEAT
|
|
N := N + 2
|
|
UNTIL IsPrime(N);
|
|
END;
|
|
WriteLn;
|
|
END BrazilianNumbers.
|