급수란 무엇인가?
급수(series)란 일정한 규칙을 따르는 수들의 나열을 의미하며, 수학에는 각기 고유한 논리나 공식으로 정의된 다양한 급수가 존재합니다. 이 문제에서는 아래와 같은 급수가 주어집니다.
2/3, -4/5, 6/7, -8/9, …
일반항
n번째 항(n은 1부터 시작)은 다음과 같이 정의할 수 있습니다.
(-1)^(n+1) × (2n) / (2n + 1)
즉, 분자와 분모가 각각 2씩 커지며, 부호는 양수와 음수가 번갈아 나타나는 패턴을 가집니다.
접근 방법
급수의 합을 구하려면 마지막 n항까지 각 항을 부호에 맞게 차례대로 더하고 빼면 됩니다.
예시 1
입력: 10 출력: -0.191921
풀이 과정
(2/3) - (4/5) + (6/7) - (8/9) + (10/11) - (12/13) + (14/15) - (16/17) + (18/19) - (20/21) = -0.191921
예시 2
입력: 17 출력: 0.77152
풀이 과정
(2/3) - (4/5) + (6/7) - (8/9) + (10/11) - (12/13) + (14/15) - (16/17) + (18/19) - (20/21) + (22/23) - (24/25) + (26/27) - (28/29) + (30/31) - (32/33) + (34/35) = 0.77152
C++ 구현 예제
#include <iostream>
using namespace std;
int main() {
int n = 17, i = 1;
double res = 0.0;
bool sign = true;
while (n > 0) {
n--;
if (sign) {
sign = !sign;
res = res + (double)++i / ++i;
} else {
sign = !sign;
res = res - (double)++i / ++i;
}
}
cout << "주어진 급수의 합은 " << res;
return 0;
}
실행 결과
주어진 급수의 합은 0.77152
코드 설명
- n: 계산할 항의 개수를 나타냅니다.
- i: 반복이 진행될 때마다 두 번씩 증가하며 분자와 분모 값을 순차적으로 생성합니다.
- sign: 불리언 변수로, 각 항의 부호(+/-)를 번갈아 결정하는 역할을 합니다.
- while 루프가 n번 실행되면서 각 항을 결과 변수 res에 누적하여 최종 합을 구합니다.
이 알고리즘은 하나의 반복문으로 모든 항을 처리하므로 시간 복잡도는 O(n)이며, 별도의 추가 메모리가 필요하지 않아 공간 복잡도는 O(1)로 매우 효율적입니다.