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

C++에서 급수의 합 구하기: a¹/1! + a²/2! + a³/3! + … + aⁿ/n!

이 문제에서는 두 개의 숫자 an이 주어지며, 우리의 과제는 C++에서 급수 a^1/1! + a^2/2! + a^3/3! + a^4/4! + …… + a^n/n!의 합을 구하는 프로그램을 작성하는 것입니다.

문제 설명

주어진 a와 n의 값을 이용해 해당 급수의 합을 구하는 것이 목표입니다. 이 급수는 특수한 형태의 급수로, 각 항은 바로 앞 항에 a/i(i는 1부터 n까지)를 곱한 값과 같습니다.

예시를 통한 문제 이해

입력

a = 3, n = 4

출력

15.375

설명

급수의 합은 다음과 같이 계산됩니다.

(3^1)/1! + (3^2)/2! + (3^3)/3! + (3^4)/4! = 3 + 9/2 + 27/6 + 81/24
= 15.375

해결 접근 방식

급수의 합을 구하기 위해 반복문(loop)을 사용하여 급수의 i번째 항을 차례대로 계산하고, 각 항을 누적하여 전체 합을 구합니다.

급수의 각 항을 매번 처음부터 직접 계산하면 거듭제곱과 팩토리얼 연산이 반복되어 상당한 계산 오버헤드가 발생합니다. 따라서 이전 항을 활용하여 다음 항을 구하는 방식을 사용하는 것이 효율적입니다.

핵심 관계식은 다음과 같습니다.

i번째 항 = (i-1)번째 항 × a/i

이 관계식을 활용하면 불필요한 중복 계산 없이 각 항을 구할 수 있어, 코드의 전체 성능이 크게 향상됩니다.

구현 예제

아래 프로그램은 위 해결 방식의 동작을 보여줍니다.

#include <iostream>
using namespace std;
float calcSeriesSum(int a, int n){
    float sumVal = 0, term = 1;
    for(float i = 1; i <= n; i++){
        term *= a/i;
        sumVal += term;
    }
    return sumVal;
}
int main(){
    int a = 3, n = 4;
    cout<<"The sum of the series is "<<calcSeriesSum(a, n);
    return 0;
}

출력

The sum of the series is 15.375

코드 설명 및 성능 분석

calcSeriesSum 함수는 변수 term에 각 항의 값을 저장하며, 반복이 진행될 때마다 term *= a/i를 통해 이전 항에서 다음 항을 바로 유도합니다. 이렇게 구한 항을 sumVal에 누적하여 최종 합을 반환합니다.

이 알고리즘은 반복문을 한 번만 순회하므로 시간 복잡도는 O(n)입니다. 만약 각 항마다 거듭제곱과 팩토리얼을 새로 계산한다면 시간 복잡도가 O(n²) 이상으로 증가할 수 있으므로, 이전 항을 재활용하는 방식이 훨씬 효율적이라는 점을 기억하세요.