정수 n이 주어지며, 이 값은 급수 1/1 + ((1+2)/(1×2)) + ((1+2+3)/(1×2×3)) + … 의 항 개수를 나타냅니다.
이 글에서는 n항까지의 급수 합을 계산하는 C++ 프로그램을 작성하는 방법을 알아보겠습니다.
예시로 문제 이해하기
입력
n = 3
출력
3.5
설명 − (1/1) + (1+2)/(1×2) + (1+2+3)/(1×2×3) = 1 + 1.5 + 1 = 3.5
이 문제의 가장 간단한 풀이 방법은 1부터 n까지 반복문을 수행하면서, 각 단계마다 'i까지의 합(sum)'을 'i까지의 곱(prod)'으로 나눈 값을 결과에 계속 더하는 것입니다.
알고리즘
result = 0.0, sum = 0, prod = 1로 초기화
1단계: i = 1부터 n까지 반복하며 아래를 수행:
1-1단계: sum과 prod 값을 갱신 → sum += i, prod *= i
1-2단계: result 값을 갱신 → result += (sum) / (prod)
2단계: result 출력
구현 예제
위 알고리즘의 동작을 보여주는 프로그램입니다.
#include <iostream>
using namespace std;
double calcSeriesSum(int n) {
double result = 0.0;
int sum = 0, prod = 1;
for (int i = 1; i <= n; i++) {
sum += i;
prod *= i;
result += ((double)sum / prod);
}
return result;
}
int main() {
int n = 12;
cout << "급수 1/1 + (1+2)/(1*2) + (1+2+3)/(1*2*3) + ... 의 " << n << "항까지의 합은 " << calcSeriesSum(n);
return 0;
}
출력
급수 1/1 + (1+2)/(1*2) + (1+2+3)/(1*2*3) + ... 의 12항까지의 합은 4.07742
복잡도 분석
시간 복잡도: O(n) — 반복문이 n번 실행되므로 입력 크기에 비례합니다.
공간 복잡도: O(1) — 몇 개의 변수만 사용하므로 추가 메모리가 거의 필요하지 않습니다.
또한, 한 가지 흥미로운 점은 각 항이 (i×(i+1)/2) / i! 형태, 즉 (i+1)/(2×(i−1)!)로 단순화될 수 있다는 것입니다. 이를 활용하면 매 단계마다 합과 곱을 따로 관리하지 않고도 점화식 기반으로 계산할 수 있어 코드를 더욱 간결하게 만들 수 있습니다.