c·c++/c 프로그래밍

자리수 제한없이 피보나치수열 구하기

바로이순간 2013. 9. 13. 02:23

#include <stdio.h>

#define MAX 1000


// 0번째 칸에는 자리수를 저장합니다. 만진법을 사용합니다.

// 1번째 칸에는 일의 자리, 2번째 칸에는 만의 자리, 3번째 칸에는 억의 자리

// ... 등을 저장합니다. 최대 3996자리까지 출력이 가능합니다.


void printResult(int []);

void copy(int a[], int b[]) {

    int i, n=a[0];

    for(i=0;i<MAX;i+=1) { b[i]=a[i]; }

}

void clear(int a[]) {

    int i;

    for(i=0;i<MAX;i+=1) { a[i]=0; }

    a[0]=1;

}

void add(int a[], int b[], int r[]) {

    int i, j, x=0;

    clear(r);

    r[0]=a[0];

    if(b[0]>r[0]) { r[0]=b[0]; }

    for(i=1;i<=r[0];i+=1) {       // 수의 각 자리와 밑에서 올라온 수를

        x=a[i]+b[i]+x;             // 더해줍니다.

        r[i]=x%10000;             // 값이 9999보다 크면 제자리의 수만 남고

        x=x/10000;                // 윗자리로 올라갑니다.

    }

    if(x!=0) { 

        r[0]+=1;

        r[r[0]]=x;

    } 

}

// 출력은 다시 큰 수 부터 출력해 준다.

void printResult(int result[]) {

    int i, x;

    x=result[0];

    printf("%d", result[x]);

    for(i=1;i<x;i+=1) {

        printf("%04d", result[x-i]);

    }

    printf("\n");

}

int main() {

    int a[MAX]={1,0,};  //  0을 나타냅니다.

    int b[MAX]={1,0,};  //  0을 나타냅니다.

    int c[MAX]={1,1,};  //  1을 나타냅니다.

    int i, n;


    printf("n= ");             // 몇번째 피보나치 수열까지 출력할지 입력합니다.

    scanf("%d", &n);

    for(i=0;i<n;i+=1) {

        copy(b, a);    // b값을 a에 복사합니다.

        copy(c, b);    // c값을 b에 복사합니다.

        add(a, b, c);  // a, b를 더해서 c에 넣습니다.

        printf("%3d ", i+1);   // 몇번째 피보나치 수열인지 표시합니다.

        printResult(b);        // 피보나치 수열을 출력합니다.

    }


    return 0;

}

'c·c++ > c 프로그래밍' 카테고리의 다른 글

두수의 비교  (0) 2013.09.13
Cramer공식을 이용한 연립방정식풀기  (0) 2013.09.13
어셈블리 리스팅 보기 vc++과 gcc(MinGW)의 경우  (0) 2013.09.12
if문 없이 성적처리하기.  (0) 2013.09.10
단어세기  (0) 2013.08.21