본문 바로가기

카테고리 없음

[C/알고리즘] 피보나치 수열(2) fibonacci

// fibonacci2.c
// 첫번째 fibonacci1.c를 모듈화 한 것.
//  피보나치 수열은 금방 커지기 때문에 int형보다, long int, long double을 선택한다.
//  형식 지정자는 자료형에 맞춰 %ld, %lf, %Lf를 사용한다. 그렇지 않으면 엉뚱한 숫자가 튀어나온다.
// 1, 1, 2, 3, 5, 8, 13... 
// 피보나치 수열은 그 앞의 숫자와 그 앞의 앞의 숫자를 합해서 자신의 숫자를 정하므로, 
// 앞의앞의 숫자를 one, 앞의 숫자를 two, 그것을 더한 자신을 three로 계산한다.
// 성능: fibonacci1.c 와 동일한 계산을 하므로 성능 양호.

#include <stdio.h>
#define MAX_NUM  200 

long double fibonacci(int maxNum) {
    long double one = 1, two = 1, three = 0;

  if(maxNum==1 || maxNum==2)  three = 1;  // 1 또는 2면 1을 돌려줌
  else {
    for(int i = 3; i <= maxNum; i++) { //인덱스가 아니라 개수로 셈함. xx번째...
      three = one + two;   // 앞의 것과 앞의앞의 것을 더함
      one = two;      // 앞의 것을 앞의앞의 것으로 전환
      two = three;     // 현재 것을 앞의 것으로 전환. 
    }   
  }  
  return three; 
}

int main(int argc, char *argv[]) 
{
  for(int i = 1; i <= MAX_NUM; i++) {
      printf("%d 번째 피보나치 수열 값: %.0Lf\n", i, fibonacci(i));
  }
  return 0;
}

-------------- 실행 결과 -------------
1 번째 피보나치 수열 값: 1
2 번째 피보나치 수열 값: 1
3 번째 피보나치 수열 값: 2
4 번째 피보나치 수열 값: 3
5 번째 피보나치 수열 값: 5
...................
197 번째 피보나치 수열 값: 66233869353085486269406456230584608882688
198 번째 피보나치 수열 값: 107168651819712326860353116949233367252992
199 번째 피보나치 수열 값: 173402521172797813134481939662687621349376
200 번째 피보나치 수열 값: 280571172992510139994835056611920988602368