이 글에서는 주어진 급수의 합을 구하는 방법을 알아보겠습니다. 여기서 n 값은 사용자가 직접 입력합니다. 가장 단순한 방법은 팩토리얼 함수를 만들어 루프의 각 단계마다 팩토리얼을 계산하는 것입니다. 하지만 팩토리얼 계산은 일반적인 덧셈에 비해 연산 비용이 크게 드는 작업입니다.
따라서 우리는 이전 단계에서 계산한 팩토리얼 값을 재사용하는 방식으로 효율성을 높일 수 있습니다. 예를 들어 3!는 (3 × 2 × 1)이고, 4!는 4 × 3!입니다. 즉, 3!를 어떤 변수에 저장해 두었다면, 여기에 다음 숫자인 4만 곱하면 곧바로 4!를 얻을 수 있습니다. 이렇게 하면 매번 처음부터 팩토리얼을 다시 계산할 필요가 없습니다.
알고리즘
sum_series_fact(n)
begin
res := 0
denominator := 1
for i in range 1 to n, do
denominator := denominator * i
res := res + i / denominator
done
return res
end
예제 코드
#include<iostream>
using namespace std;
float series_result(int n) {
float denominator = 1;
float res = 0;
for(int i = 1; i<= n; i++) {
denominator *= i;
res += float(i/denominator);
}
return res;
}
main() {
int n;
cout << "항의 개수를 입력하세요: ";
cin >> n;
cout << "결과: " << series_result(n);
}
실행 결과
항의 개수를 입력하세요: 5 결과: 2.70833
실행 결과
항의 개수를 입력하세요: 3 결과: 2.5
동작 원리 정리
위 코드에서 핵심 변수는 두 가지입니다.
denominator : 현재까지의 팩토리얼 값(분모)을 저장합니다. 루프가 한 번 돌 때마다 현재 인덱스 i를 곱해 다음 팩토리얼로 갱신됩니다.
res : 각 항(i / i!)을 누적하여 최종 급수의 합을 저장합니다.
예를 들어 n = 5일 때, 급수는 1/1! + 2/2! + 3/3! + 4/4! + 5/5! = 1 + 1 + 0.5 + 0.1667 + 0.04167 ≈ 2.70833이 되어 실행 결과와 일치함을 확인할 수 있습니다. 흥미로운 점은 n이 커질수록 이 급수의 합은 자연상수 e(≈ 2.71828)에 수렴한다는 사실입니다.