Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구하는 급수의 합: 1/1 + (1+2)/(1×2) + (1+2+3)/(1×2×3) + … 최대 n항까지


정수 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)!)로 단순화될 수 있다는 것입니다. 이를 활용하면 매 단계마다 합과 곱을 따로 관리하지 않고도 점화식 기반으로 계산할 수 있어 코드를 더욱 간결하게 만들 수 있습니다.