Search code examples
cobol

Happy Numbers in COBOL


As the title implies, I'm doing a software that calculate and verify if the number inserted is a happy number (OR NOT). In COBOL language (For reference about what a happy number is https://mathworld.wolfram.com/HappyNumber.html).

Right now, my code doesnt calculate correctly if the number is happy or not (In the program HEY = Happy and HOY = not happy :C)

My question is, what am i doing wrong in the code? All i need now is to properly detect if its happy or not. Any help is well welcome.

This is my current code:

IDENTIFICATION DIVISION.
       PROGRAM-ID. YOUR-PROGRAM-NAME.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01 num PIC 9(36).
       01 addc PIC 9(36).
       01 rem PIC 9(36).
       01 pow PIC 9(36).
       01 toast PIC 9.
       01 k PIC 999 VALUE 0.
       01 l PIC 9(36).
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           DISPLAY"Escribe numero "
           ACCEPT num
           PERFORM WITH TEST AFTER UNTIL addc = 1
               MOVE 0 TO addc
               PERFORM WITH TEST AFTER UNTIL num = 0
                   DIVIDE num BY 10 GIVING num REMAINDER rem
                   MULTIPLY rem BY rem GIVING pow
                   MOVE pow TO addc
               END-PERFORM

               IF addc = 1
                   MOVE 1 TO toast
               ELSE
                   MOVE addc TO num
                   ADD 1 TO k
                   IF k = 20
                       MOVE 1 TO addc
                       MOVE 0 TO toast
                   END-IF
               END-IF
           END-PERFORM

           IF toast = 1
               DISPLAY "HEY"
           ELSE
               DISPLAY "HOY"
           END-IF
            STOP RUN.
       END PROGRAM YOUR-PROGRAM-NAME.

Also, as an extra question, how can i handle numbers above the maximum limit of 36? without using the equivalent of strings and chars in Cobol.


Solution

  • The line:

    PERFORM UNTIL num > 0
    

    makes the PERFORM loop to not enter, as num is likely to be greater than 0. What you want to do is to execute the loop, getting all the digits from num UNTIL num is 0.

    Besides,

    MOVE pow TO addc
    

    should be

    ADD pow TO addc