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

C++로 급수의 합 구하기: 1/(1×2) + 1/(2×3) + 1/(3×4) + … 반복문과 공식 풀이

이 문제에서는 급수 1/(1×2) + 1/(2×3) + … + 1/(n×(n+1))의 제 n항을 나타내는 숫자 n이 주어집니다. 우리의 과제는 이 급수의 합을 구하는 프로그램을 작성하는 것입니다.

예시를 통한 문제 이해

입력

n = 3

출력

0.75

설명 — 합 = 1/(1×2) + 1/(2×3) + 1/(3×4) = 1/2 + 1/6 + 1/12 = (6+2+1)/12 = 9/12 = 3/4 = 0.75

가장 간단한 풀이 방법은 반복문을 사용해 급수의 각 항 값을 하나씩 계산한 뒤, 모두 더해 합을 구하는 것입니다.

방법 1: 반복문을 이용한 풀이

알고리즘

sum = 0으로 초기화
1단계: i = 1부터 n까지 반복하며 다음을 수행
    1.1단계: sum += 1 / (i * (i+1)) 로 합을 갱신
2단계: sum 출력

예제 코드

풀이 과정을 보여주는 C++ 프로그램입니다.

#include <iostream>
using namespace std;

double calcSeriesSum(int n) {
    double sum = 0.0;
    for (int i = 1; i <= n; i++)
        sum += ((double)1 / (i * (i + 1)));
    return sum;
}

int main() {
    int n = 5;
    cout << "급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: " << calcSeriesSum(n);
    return 0;
}

실행 결과

급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: 0.833333

이 방법은 정확하게 동작하지만, 반복문을 사용하기 때문에 시간 복잡도가 O(n)입니다. 따라서 n이 매우 커지면 성능이 떨어질 수 있습니다.

방법 2: 일반 공식을 이용한 효율적인 풀이

훨씬 효율적인 접근 방식은 급수의 합에 대한 일반 공식을 유도하는 것입니다. 이 급수는 망원급수(telescoping series)의 성질을 가지며, 전개하면 인접한 항들이 서로 상쇄됩니다.

급수: 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ...
n번째 항: an = 1/n(n+1)

an = ((n+1) - n) / n(n+1)
an = (n+1)/n(n+1) - n/n(n+1)
an = 1/n - 1/(n+1)

급수의 합:
sum = 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ...

각 항을 위 공식으로 변형하면,
sum = 1/1 - 1/2 + 1/2 - 1/3 + 1/3 - 1/4 + 1/4 - 1/5 + ... + 1/n - 1/(n+1)

중간 항들이 모두 상쇄되므로,
sum = 1 - 1/(n+1)
sum = (n+1-1)/(n+1) = n/(n+1)

즉, 이 급수의 합은 n/(n+1)이라는 아주 간단한 공식으로 표현할 수 있습니다.

예제 코드

#include <iostream>
using namespace std;

double calcSeriesSum(int n) {
    return ((double)n / (n + 1));
}

int main() {
    int n = 5;
    cout << "급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: " << calcSeriesSum(n);
    return 0;
}

실행 결과

급수 1/(1*2) + 1/(2*3) + 1/(3*4) + 1/(4*5) + ... 의 합: 0.833333

마무리

두 방법 모두 동일한 결과를 반환하지만, 공식 기반 풀이는 반복 없이 단 한 번의 연산으로 답을 구하므로 시간 복잡도가 O(1)입니다. 입력 크기와 무관하게 즉시 결과를 얻을 수 있어, 실전 코딩 테스트에서는 망원급수 공식을 활용한 두 번째 방법이 훨씬 유리합니다.