RosettaCodeData/Task/Recamans-sequence/COBOL/recamans-sequence.cobol

60 lines
1.9 KiB
COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. RECAMAN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RECAMAN-SEQUENCE COMP.
02 A PIC 999 OCCURS 99 TIMES INDEXED BY I.
02 N PIC 999 VALUE 0.
01 VARIABLES COMP.
02 ADDC PIC S999.
02 SUBC PIC S999.
02 SPTR PIC 99 VALUE 1.
01 OUTPUT-FORMAT.
02 OUTI PIC Z9.
02 OUTN PIC BZ9.
02 OUTS PIC X(79).
PROCEDURE DIVISION.
BEGIN.
PERFORM GENERATE-NEXT-ITEM 15 TIMES.
PERFORM COLLATE-ITEM VARYING I FROM 1 BY 1
UNTIL I IS GREATER THAN 15.
DISPLAY 'First 15 items:' OUTS.
FIND-REPEATING.
PERFORM GENERATE-NEXT-ITEM.
SET I TO 1.
SEARCH A VARYING I
WHEN I IS NOT LESS THAN N
NEXT SENTENCE
WHEN A(I) IS EQUAL TO A(N)
SUBTRACT 1 FROM N GIVING OUTI
MOVE A(N) TO OUTN
DISPLAY 'First repeated item: A(' OUTI ') =' OUTN
STOP RUN.
GO TO FIND-REPEATING.
GENERATE-NEXT-ITEM.
IF N IS EQUAL TO ZERO
MOVE ZERO TO A(1)
ELSE
ADD N, A(N) GIVING ADDC
SUBTRACT N FROM A(N) GIVING SUBC
IF SUBC IS NOT GREATER THAN ZERO
MOVE ADDC TO A(N + 1)
ELSE
SET I TO 1
SEARCH A VARYING I
WHEN I IS NOT LESS THAN N
MOVE SUBC TO A(N + 1)
WHEN A(I) IS EQUAL TO SUBC
MOVE ADDC TO A(N + 1).
ADD 1 TO N.
COLLATE-ITEM.
MOVE A(I) TO OUTN.
STRING OUTN DELIMITED BY SIZE INTO OUTS WITH POINTER SPTR.