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

C++로 1-2+3-4+5-6+7... 교대 급수의 N항까지의 합 구하기

문제 개요

이 문제에서는 정수 N이 주어지며, 우리의 목표는 1 - 2 + 3 - 4 + 5 - 6 + 7...과 같이 부호가 번갈아 나타나는 교대 급수의 첫 N항까지의 합을 구하는 것입니다.

급수는 다음과 같이 진행됩니다.

1 - 2 + 3 - 4 + 5 - 6 + 7 - 8 + 9 - 10 ...

예제를 통해 문제를 살펴보겠습니다.

입력 : N = 4
출력 : -2

설명

1 - 2 + 3 - 4 = -2

풀이 접근 방법

이 문제를 효율적으로 해결하는 핵심은 급수의 일반항을 분석하여 합의 공식을 도출하는 것입니다. 반복문 없이 공식만으로 계산하면 시간 복잡도를 O(1)까지 줄일 수 있어 매우 빠른 처리가 가능합니다.

먼저 몇 가지 값에 대해 급수의 합을 직접 계산해 보며 패턴을 찾아보겠습니다.

  • sum(1) = 1
  • sum(2) = 1 - 2 = -1
  • sum(3) = 1 - 2 + 3 = 2
  • sum(4) = 1 - 2 + 3 - 4 = -2
  • sum(5) = 1 - 2 + 3 - 4 + 5 = 3
  • sum(6) = 1 - 2 + 3 - 4 + 5 - 6 = -3
  • sum(7) = 1 - 2 + 3 - 4 + 5 - 6 + 7 = 4
  • sum(8) = 1 - 2 + 3 - 4 + 5 - 6 + 7 - 8 = -4

위 결과를 관찰하면 명확한 규칙을 발견할 수 있습니다.

  • n이 홀수인 경우 : Sum = (n + 1) / 2
  • n이 짝수인 경우 : Sum = -(n / 2)

즉, 짝수 항에서는 음수 절반, 홀수 항에서는 양수 절반이 되는 간단한 공식으로 전체 합을 즉시 구할 수 있습니다.

구현 예제

다음은 위 풀이 방법의 동작을 보여주는 C++ 프로그램입니다.

#include<iostream>
using namespace std;

// N항까지의 급수 합을 계산하는 함수
int calcSumNTerms(int n) {
    // n이 짝수인 경우 : 합은 -(n/2)
    if(n % 2 == 0)
        return ((-1) * (n / 2));
    // n이 홀수인 경우 : 합은 (n+1)/2
    return ((n + 1) / 2);
}

int main() {
    int n = 156;
    cout << "N항까지의 급수 합은 " << calcSumNTerms(n);
    return 0;
}

실행 결과

N항까지의 급수 합은 -78

N = 156은 짝수이므로, 공식에 따라 -(156 / 2) = -78이라는 결과가 출력됩니다. 이처럼 일반항을 찾아 공식화하면 반복 연산 없이 상수 시간 안에 정답을 구할 수 있습니다.