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 |