본문 바로가기
프로그래밍/Fortran 77

[FORTRAN 기초] 알고리즘 2편: 피보나치 수열과 팩토리얼 계산 fortran code

by 오!쎈세! 2026. 6. 22.
알고리즘 설계의 기초인 '변수 값 밀어내기'와 '누적 곱셈'의 원리를 포트란 77 문법으로 구현해 본다. 수식 연산에 최적화된 언어 특성을 활용하여 다중 루프 구조를 간결하게 표현함.
🟪 1. 데이터 영역 및 변수 선언 (Specification)
수열 회전 시 이전 값을 보관할 정수형 변수들과, 팩토리얼 곱셈 값이 기하급수적으로 커질 것에 대비해 넉넉한 숫자형 공간(INTEGER)을 선언함. 7번째 칸 규칙을 엄수해야 한다.
fortran code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
C      ====== 1번째 칸에 'C'를 적으면 이 줄은 주석 공간이 됨 ======
       PROGRAM FIB_FACT_MASTER
       IMPLICIT NONE
       
*      [피보나치 변수] 첫 번째(A), 두 번째(B), 합산결과(C) 및 루프 인덱스
       INTEGER FIBA, FIBB, FIBC, FIBIDX
       
*      [팩토리얼 변수] 루프 인덱스, 제한 한도, 그리고 결과를 담을 변수
       INTEGER FCTIDX, FCTLMT, FCTRES
코드를 사용할 때는 주의가 필요합니다.
 

🟩 2. 두 가지 알고리즘 반복 연산 (Execution)
DO 루프를 활용하여 피보나치는 변수 값을 한 칸씩 밀어내며 10번째 항까지 연속 출력하고, 팩토리얼은 1부터 5까지 곱셈을 누적하는 영역임.
fortran code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
*      =============================================================
*      [알고리즘 A] 피보나치 수열 10번째 항까지 구하기 (DO 루프)
*      =============================================================
*      [초기화] 피보나치 초기 변수 값 세팅 및 첫 두 항 출력
       FIBA = 1
       FIBB = 1
       WRITE(*, 700) FIBA
       WRITE(*, 700) FIBB

*      3번째 항부터 10번째 항까지 1씩 증가하며 반복 실행함
       DO 20 FIBIDX = 3, 10, 1
           FIBC = FIBA + FIBB
           WRITE(*, 700) FIBC
           
*          [값 밀어내기] 다음 회전을 위해 변수 값을 왼쪽으로 이관함 (순서 주의)
           FIBA = FIBB
           FIBB = FIBC
20     CONTINUE

*      =============================================================
*      [알고리즘 B] 5 팩토리얼 (5!) 누적 곱셈 연산
*      =============================================================
*      [초기화] 곱셈 변수이므로 반드시 초깃값을 0이 아닌 1로 세팅해야 함
       FCTRES = 1
       FCTLMT = 5

       DO 30 FCTIDX = 1, FCTLMT, 1
*          기존 결과값에 인덱스 숫자를 지속적으로 누적 곱셈함
           FCTRES = FCTRES * FCTIDX
30     CONTINUE

       WRITE(*, 800) FCTRES
*      -> 정상 구동 시 5 * 4 * 3 * 2 * 1 연산 결과인 '120'이 출력됨

       STOP
       
C      =================================================================
C      [FORMAT 정의 구역] 결과 데이터 표출 포맷 선언 (1~5칸 레이블)
C      =================================================================
700    FORMAT(1X, 'FIBONACCI ITEM : ', I4)
800    FORMAT(1X, '5 FACTORIAL (5!) RESULT : ', I6)

       END
코드를 사용할 때는 주의가 필요합니다.
 

💡 [실무 팁] 피보나치 '값 밀어내기 순서'와 팩토리얼 '초깃값 1'의 규칙
정보처리기능사 실기 시험 순서도 추적 검사(Trace) 시 화살표 방향을 헷갈려 대량 오답을 유발하던 두 가지 핵심 알고리즘 통제 규칙임.
  • 피보나치 값 복사 시의 우선순위
    • FIBC = FIBA + FIBB 연산 직후 변수 공간을 갱신할 때, 반드시 FIBA = FIBB를 먼저 실행하고 나서 FIBB = FIBC를 처리해야 함.
    • 만약 순서를 뒤바꿔 FIBB = FIBC를 먼저 실행해 버리면, 변수 FIBB가 가지고 있던 기존 원본 데이터가 증발하여 다음 라인에서 FIBA = FIBB를 할 때 엉뚱한 최신 값 FIBC가 중복 복사되는 복합 논리 오류가 발생함.
  • 팩토리얼 누적 변수의 0 초기화 금지 규칙
    • 더하기 연산 변수는 쓰레기 값을 청소하기 위해 0으로 리셋하는 것이 정석이었음.
    • 반면 곱셈을 지속적으로 누적하는 변수(FCTRES)를 0으로 세팅하는 순간 0 * 1 = 0, 0 * 2 = 0이 되어 루프를 아무리 돌려도 최종 결과가 무조건 0으로 수렴하는 프로그램 파괴 대참사가 발생함. 곱셈 연산 버퍼는 반드시 초기값 1로 시작하는 것이 규칙이다.