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

C 프로그래밍으로 수열 2, 22, 222…의 합 구하기

2, 22, 222, 2222, …처럼 각 자릿수가 모두 2로 채워진 수열의 합을 구하는 문제를 생각해 보겠습니다. 항의 개수가 많아지면 일일이 더하는 것은 비효율적이므로, 수학적 공식을 미리 유도한 뒤 한 번의 계산으로 결과를 얻는 것이 효과적입니다.

공식 유도 과정

수열의 성질을 이용하면 다음과 같이 단계적으로 합의 공식을 유도할 수 있습니다.

합 = 2 + 22 + 222 + 2222 + … (n개의 항)
   = 2 × (1 + 11 + 111 + 1111 + …)
   = (2/9) × (9 + 99 + 999 + 9999 + …)
   = (2/9) × [(10 − 1) + (100 − 1) + (1000 − 1) + …]
   = (2/9) × [(10 + 100 + 1000 + … + 10ⁿ) − n]
   = (2/9) × [10(10ⁿ − 1)/9 − n]
   = 2(10ⁿ⁺¹ − 10 − 9n) / 81

즉, 항의 개수 n만 알면 위 공식에 대입하는 것만으로 수열 전체의 합을 바로 계산할 수 있습니다.

C 언어 예제 코드

#include <stdio.h>
#include <math.h>

int main() {
    int n = 3;
    float sum = 2 * (pow(10, n + 1) - 10 - 9 * n) / 81;
    printf("합은 %.2f 입니다\n", sum);
    return 0;
}

실행 결과

n = 3 일 때
합은 246.00 입니다

실제로 2 + 22 + 222 = 246이므로, 공식과 코드의 결과가 일치하는 것을 확인할 수 있습니다.

코드 설명

  • n: 더할 항의 개수를 저장하는 변수입니다. 값을 바꾸면 원하는 길이의 수열 합을 구할 수 있습니다.
  • pow(10, n + 1): math.h 헤더에 선언된 거듭제곱 함수로, 10의 (n+1)제곱을 계산합니다.
  • 합 공식: 앞서 유도한 2(10ⁿ⁺¹ − 10 − 9n) / 81을 그대로 코드로 옮긴 것입니다.
  • printf 서식 지정자: sum이 float 타입이므로 %f를 사용해야 합니다. 정수용 %d와 실수 변수를 함께 사용하면 예상과 다른 엉뚱한 값이 출력될 수 있으므로 주의해야 합니다.

이처럼 반복문 없이도 수학적 공식 하나로 수열의 합을 빠르게 계산할 수 있으며, 항의 개수가 아무리 커져도 O(1)의 시간 복잡도로 결과를 얻을 수 있다는 점이 이 방법의 가장 큰 장점입니다.