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

무한자리 분수의 계산

바로이순간 2013. 5. 28. 09:57

1부터 시작하여 n까지의 분수의 합을 구하는 프로그램입니다.

이 프로그램에서는 소수이하 1000자리까지 구하고 있습니다.


[예] 

n=4일때

 1 + 1/2 + 1/3 + 1/4 = (결과)

n=6일때

 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 = (결과)


1000자리까지 정확하게 나오는 프로그램을 작성하는 것도 가능하겠습니다.

아래 프로그램은 조금만 더 손을 보면 더 많은 자리수를 같은 노력으로 구할 수

있을 것으로 보인다.


하지만 원리를 보이기 위해서 가장 간단한 방식으로 작성해 보았다.


#include <stdio.h>

#define MAX 1000

// 0번째 칸에는 정수값을 저장합니다.

// 1번째 칸에는 소수첫째 자리, 2번째 칸에는 소수둘째 자리,... 등을 저장합니다.

// 지금은 200자리를 출력하도록 짰습니다.

int longSum[MAX]={0,};

int fraction[MAX]={0,};

void add() {

    int i, x;

    for(i=MAX-1;i>0;i-=1) {

        x=longSum[i]+fraction[i];

        longSum[i]=x%10;

        longSum[i-1]+=x/10;

    }

    longSum[0]+=fraction[0];

    // 반올림 부분

    if(longSum[MAX-1]>4) {

        longSum[MAX-1]=0;

        i=MAX-2;

        longSum[i]+=1;

        while(longSum[i]>9) {

            longSum[i]=0;

            longSum[i-1]+=1;

            i-=1;

        }

    }

}

void getFraction(int n) {

    int i, x;

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

        fraction[i]=0;

    }

    fraction[0]=1;

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

        x=fraction[i];

        fraction[i]=x/n;

        fraction[i+1]+=(x%n)*10;

    }

    // 더하고 나서 반올림을 합니다.

}

void printResult() {

    int i, x;

    printf("%d.", longSum[0]);

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

        printf("%d", longSum[i]);

    }

    printf("\n");

}

int main() {

    int i, x;

    printf("입력: ");

    scanf("%d", &x);

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

        longSum[i]=0;

    }

    //printResult();

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

        getFraction(i);

        add();

    }

    printResult();


    return 0;

}


입력을 1, 2, 3, ...10, 100, 1000, 10000 등을 넣어 보면서 제대로 동작하는지

확인해 보면 되겠습니다.

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

감염된 컴퓨터수 구하기  (0) 2013.05.28
가우스.조던 소거법에 의한 역행렬구하기  (0) 2013.05.28
레벨오더,인오더로 부터 이진나무 만들기  (0) 2013.05.25
count words  (0) 2013.05.21
c/c++ 책소개  (0) 2013.05.20