이 문제에서는 두 개의 숫자 a와 n이 주어지며, 우리의 과제는 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²) 이상으로 증가할 수 있으므로, 이전 항을 재활용하는 방식이 훨씬 효율적이라는 점을 기억하세요.