RosettaCodeData/Task/Brazilian-numbers/QuickBASIC/brazilian-numbers.basic
2026-04-30 12:34:36 -04:00

98 lines
1.8 KiB
Text

' Brazilian numbers
DECLARE FUNCTION IsBrazilian% (N%)
DECLARE FUNCTION SameDigits% (BYVAL N%, B%)
DECLARE FUNCTION IsPrime% (N%)
CONST TRUE% = -1, FALSE% = 0
PRINT "First 20 Brazilian numbers:"
C% = 0: N% = 7
DO WHILE C% < 20
IF IsBrazilian%(N%) THEN
PRINT N%;
C% = C% + 1
END IF
N% = N% + 1
LOOP
PRINT
PRINT
PRINT "First 20 odd Brazilian numbers:"
C% = 0: N% = 7
DO WHILE C% < 20
IF IsBrazilian%(N%) THEN
PRINT N%;
C% = C% + 1
END IF
N% = N% + 2
LOOP
PRINT
PRINT
PRINT "First 20 prime Brazilian numbers:"
C% = 0: N% = 7
DO WHILE C% < 20
IF IsBrazilian%(N%) THEN
PRINT N%;
C% = C% + 1
END IF
DO
N% = N% + 2
LOOP UNTIL IsPrime%(N%)
LOOP
PRINT
END
FUNCTION IsBrazilian% (N%)
IF N% < 7 THEN
IsBrazilian% = FALSE%
ELSEIF (N% MOD 2 = 0) AND (N% >= 8) THEN
IsBrazilian% = TRUE%
ELSE
FOR B% = 2 TO N% - 2
IF SameDigits%(N%, B%) THEN
IsBrazilian% = TRUE%
EXIT FUNCTION
END IF
NEXT B%
IsBrazilian% = FALSE%
END IF
END FUNCTION
FUNCTION IsPrime% (N%)
IF N% < 2 THEN
IsPrime% = FALSE%
ELSEIF N% MOD 2 = 0 THEN
IsPrime% = (N% = 2)
ELSEIF N% MOD 3 = 0 THEN
IsPrime% = (N% = 3)
ELSE
D& = 5
DO WHILE D& * D& <= N%
IF N% MOD D& = 0 THEN
IsPrime% = FALSE%
EXIT FUNCTION
ELSE
D& = D& + 2
IF N% MOD D& = 0 THEN
IsPrime% = FALSE%
EXIT FUNCTION
ELSE
D& = D& + 4
END IF
END IF
LOOP
IsPrime% = TRUE%
END IF
END FUNCTION
FUNCTION SameDigits% (BYVAL N%, B%)
' Result: TRUE% if N has same digits in the base B%, FALSE% otherwise
F = N% MOD B%
N% = N% \ B%
DO WHILE N% > 0
IF N% MOD B% <> F THEN
SameDigits% = FALSE%
EXIT FUNCTION
END IF
N% = N% \ B%
LOOP
SameDigits% = TRUE%
END FUNCTION