RosettaCodeData/Task/Arithmetic-numbers/COBOL/arithmetic-numbers.cob
2026-04-30 12:34:36 -04:00

127 lines
3.8 KiB
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. ARITHMETIC-NUMBERS.
AUTHOR. CONVERTED-FROM-JAVA.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTERS.
05 ARITHMETIC-COUNT PIC 9(7) VALUE 0.
05 COMPOSITE-COUNT PIC 9(7) VALUE 0.
05 N PIC 9(7) VALUE 1.
05 LINE-COUNT PIC 99 VALUE 0.
01 FACTOR-RELATED.
05 FACTOR-COUNT PIC 9(4) VALUE 0.
05 FACTOR-SUM PIC 9(9) VALUE 0.
05 I PIC 9(7).
05 J PIC 9(7).
05 PRODUCT PIC 9(9).
05 DIV-REMAINDER PIC 9(9).
05 MOD-RESULT PIC 9(9).
05 TEMP-FACTOR PIC 9(7).
05 FOUND-FLAG PIC X VALUE 'N'.
01 FACTOR-TABLE.
05 FACTORS OCCURS 1000 TIMES INDEXED BY FX.
10 FACTOR-VALUE PIC 9(7) VALUE 0.
01 OUTPUT-FIELDS.
05 N-FORMATTED PIC ZZZ.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM UNTIL ARITHMETIC-COUNT > 1000000
PERFORM FIND-FACTORS
PERFORM CALCULATE-SUM
DIVIDE FACTOR-SUM BY FACTOR-COUNT
GIVING MOD-RESULT REMAINDER DIV-REMAINDER
IF DIV-REMAINDER = 0
ADD 1 TO ARITHMETIC-COUNT
IF FACTOR-COUNT > 2
ADD 1 TO COMPOSITE-COUNT
END-IF
IF ARITHMETIC-COUNT <= 100
PERFORM DISPLAY-NUMBER
END-IF
EVALUATE ARITHMETIC-COUNT
WHEN 1000
WHEN 10000
WHEN 100000
WHEN 1000000
PERFORM DISPLAY-MILESTONE
END-EVALUATE
END-IF
ADD 1 TO N
END-PERFORM
STOP RUN.
FIND-FACTORS.
INITIALIZE FACTOR-TABLE
MOVE 0 TO FACTOR-COUNT
MOVE 1 TO TEMP-FACTOR
PERFORM ADD-UNIQUE-FACTOR
MOVE N TO TEMP-FACTOR
PERFORM ADD-UNIQUE-FACTOR
MOVE 2 TO I
PERFORM UNTIL I * I > N
DIVIDE N BY I GIVING J REMAINDER DIV-REMAINDER
IF DIV-REMAINDER = 0
MOVE I TO TEMP-FACTOR
PERFORM ADD-UNIQUE-FACTOR
MOVE J TO TEMP-FACTOR
PERFORM ADD-UNIQUE-FACTOR
END-IF
ADD 1 TO I
END-PERFORM.
ADD-UNIQUE-FACTOR.
MOVE 'N' TO FOUND-FLAG
PERFORM VARYING FX FROM 1 BY 1 UNTIL FX > FACTOR-COUNT
IF FACTOR-VALUE(FX) = TEMP-FACTOR
MOVE 'Y' TO FOUND-FLAG
EXIT PERFORM
END-IF
END-PERFORM
IF FOUND-FLAG = 'N'
ADD 1 TO FACTOR-COUNT
MOVE TEMP-FACTOR TO FACTOR-VALUE(FACTOR-COUNT)
END-IF.
CALCULATE-SUM.
MOVE 0 TO FACTOR-SUM
PERFORM VARYING FX FROM 1 BY 1 UNTIL FX > FACTOR-COUNT
ADD FACTOR-VALUE(FX) TO FACTOR-SUM
END-PERFORM.
DISPLAY-NUMBER.
MOVE N TO N-FORMATTED
DISPLAY N-FORMATTED WITH NO ADVANCING
ADD 1 TO LINE-COUNT
IF LINE-COUNT = 10
DISPLAY " "
MOVE 0 TO LINE-COUNT
ELSE
DISPLAY " " WITH NO ADVANCING
END-IF.
DISPLAY-MILESTONE.
DISPLAY " "
DISPLAY ARITHMETIC-COUNT "th arithmetic number is " N
DISPLAY "Number of composite arithmetic numbers <= "
N ": " COMPOSITE-COUNT.