#cobol
#cobol
Вопрос:
Как следует из названия, я делаю программное обеспечение, которое вычисляет и проверяет, является ли вставленное число счастливым числом (ИЛИ НЕТ). На языке COBOL (для справки о том, что такое счастливое число https://mathworld .wolfram.com/HappyNumber.html ).
Прямо сейчас мой код неправильно вычисляет, является ли число счастливым или нет (в программе HEY = Happy и HOY = not happy : C)
Мой вопрос в том, что я делаю не так в коде? Все, что мне нужно сейчас, это правильно определить, счастливы они или нет. Любая помощь приветствуется.
Это мой текущий код:
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.
Кроме того, в качестве дополнительного вопроса, как я могу обрабатывать числа выше максимального предела 36? без использования эквивалента строк и символов в Cobol.
Комментарии:
1. @SimonSobisch Отредактировал, и скажите мне, понятно это или нет. Спасибо.
2. К вашему сведению, я удалил вашу заметку о понижении голосов в конце вашего вопроса — это не имеет ничего общего с вашим вопросом и выглядит грубо. Людям предлагается голосовать, будь то за или против, без какого-либо правила о необходимости предоставления комментария, объясняющего голос за / против. Тем не менее: из вашего вопроса неясно, в чем заключается ваша конкретная проблема. Вы упомянули цикл, но неясно, что происходит не так. Пожалуйста, отредактируйте свой вопрос со всеми подробностями, включая объяснение того, что именно должно делать это приложение (например, не думайте, что люди знают, что такое «счастливое число»).
3. @DavidMakogon Спасибо за замечание, и часть с понижением голосов — это не ругань или грубость, но иногда люди опускают голоса и уходят, по крайней мере, я хотел узнать причину этого, чтобы отредактировать вопрос (как я сделал после прочтения ваших комментариев и комментариев Саймона), и я надеюсь, что теперь все ясно.
4. Теперь это определенно достаточно ясно.
Ответ №1:
Строка:
PERFORM UNTIL num > 0
заставляет цикл выполнения не входить, так как num
, вероятно, будет больше 0. Что вы хотите сделать, так это выполнить цикл, получая все цифры от num ДО num, равного 0.
Кроме того,
MOVE pow TO addc
должно быть
ADD pow TO addc
Комментарии:
1. Да, пока я редактировал вопрос после наблюдения Дэвида, я также проверял код и изменил его на ВЫПОЛНЕНИЕ ДО num = 0, и теперь цикл заканчивается, но что-то не так с циклами, потому что он неправильно определяет nnumbers
2. Хорошо, другая ошибка — ПЕРЕМЕСТИТЬ pow В addc, который должен быть ADD pow В addc
3. Но когда вы добавляете, разве переменная получателя также не добавляет то, что у нее есть? например, когда ADDC = 2 и POW = 3, тогда получается 5, но когда POW = 2 и ADDC = 5, результат будет 7? Я немного смущен добавлением в Cobol, это моя вторая программа на этом языке
4. Я считаю, что ADD ведет себя так: addc = addc pow, так что да, это будет 7
5. Неважно, кажется, теперь это работает, большое вам спасибо XD