C 언어로 완전수 판별하기

CBeginner
지금 연습하기

소개

이 실습에서는 주어진 숫자가 완전수인지 확인하는 C 프로그램을 작성하는 방법을 배웁니다. 프로그램은 사용자로부터 정수 입력을 받아, 그 수의 진약수 (proper divisors) 의 합을 계산하고, 그 숫자가 완전수인지 아닌지를 판단합니다. 이 실습은 수론 및 이산수학의 기본 개념을 다루며, C 프로그래밍에서 이러한 원리를 실제로 적용하는 방법을 보여줍니다.

프로그램은 먼저 사용자에게 양의 정수를 입력하도록 요청합니다. 그런 다음, 그 숫자보다 작은 모든 양의 정수 중에서 그 숫자를 나누어 떨어지게 하는 진약수 (proper divisors) 의 합을 계산합니다. 마지막으로, 프로그램은 진약수의 합을 원래 숫자와 비교하여 결과를 출력하고, 그 숫자가 완전수인지 아닌지를 나타냅니다.

정수 입력

이 단계에서는 완전수를 확인하기 위한 C 에서 정수 입력을 받는 방법을 배웁니다. 사용자가 분석할 숫자를 입력할 수 있도록 하는 C 프로그램을 만들 것입니다.

먼저 프로젝트 디렉토리에 새로운 C 파일을 생성합니다.

cd ~/project
nano perfect_number.c

이제 다음 코드를 파일에 추가합니다.

#include <stdio.h>

int main() {
    int number;

    // 사용자에게 입력을 요청합니다.
    printf("완전수인지 확인할 양의 정수를 입력하세요: ");
    scanf("%d", &number);

    // 입력된 숫자를 출력하여 입력을 확인합니다.
    printf("입력한 숫자: %d\n", number);

    return 0;
}

예시 출력:

완전수인지 확인할 양의 정수를 입력하세요: 28
입력한 숫자: 28

코드를 살펴보겠습니다.

  • #include <stdio.h>는 표준 입력/출력 라이브러리를 포함합니다.
  • scanf("%d", &number)는 사용자로부터 정수 입력을 받습니다.
  • printf()는 입력을 요청하고 입력된 숫자를 표시하는 데 사용됩니다.

프로그램을 컴파일하고 실행합니다.

gcc perfect_number.c -o perfect_number
./perfect_number

진약수의 합 계산 및 숫자와 비교

이 단계에서는 이전 C 프로그램을 수정하여 진약수의 합을 계산하고 숫자가 완전수인지 확인하는 방법을 배웁니다.

기존 파일을 열고 코드를 업데이트합니다.

nano ~/project/perfect_number.c

이전 코드를 다음 코드로 바꿉니다.

#include <stdio.h>

int main() {
    int number, sum = 0;

    // 사용자에게 입력을 요청합니다.
    printf("완전수인지 확인할 양의 정수를 입력하세요: ");
    scanf("%d", &number);

    // 진약수의 합을 계산합니다.
    for (int i = 1; i < number; i++) {
        if (number % i == 0) {
            sum += i;
        }
    }

    // 숫자가 완전수인지 확인합니다.
    if (sum == number) {
        printf("%d는 완전수입니다!\n", number);
    } else {
        printf("%d는 완전수가 아닙니다.\n", number);
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc perfect_number.c -o perfect_number
./perfect_number

완전수에 대한 예시 출력:

완전수인지 확인할 양의 정수를 입력하세요: 28
28는 완전수입니다!

완전수가 아닌 경우에 대한 예시 출력:

완전수인지 확인할 양의 정수를 입력하세요: 12
12는 완전수가 아닙니다.

핵심 개념 설명:

  • for 루프는 1 부터 number - 1까지의 숫자를 반복합니다.
  • number % i == 0i가 숫자의 약수인지 확인합니다.
  • sum += i는 모든 진약수를 더합니다.
  • 완전수는 양의 정수로서, 자기 자신보다 작은 모든 양의 약수의 합과 같습니다.

결과 출력

이 마지막 단계에서는 완전수에 대한 더 자세한 출력, 즉 약수와 합을 포함하여 프로그램을 개선합니다.

파일을 열고 코드를 업데이트합니다.

nano ~/project/perfect_number.c

이전 코드를 다음 코드로 바꿉니다.

#include <stdio.h>

int main() {
    int number, sum = 0;

    // 사용자에게 입력을 요청합니다.
    printf("완전수인지 확인할 양의 정수를 입력하세요: ");
    scanf("%d", &number);

    // 약수 출력을 위한 헤더 출력
    printf("%d의 진약수: ", number);

    // 진약수의 합을 계산하고 출력합니다.
    for (int i = 1; i < number; i++) {
        if (number % i == 0) {
            printf("%d ", i);
            sum += i;
        }
    }

    // 자세한 결과 출력
    printf("\n\n진약수의 합: %d", sum);

    // 완전수 여부를 확인하고 출력합니다.
    if (sum == number) {
        printf("\n%d는 완전수입니다!\n", number);
    } else {
        printf("\n%d는 완전수가 아닙니다.\n", number);
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc perfect_number.c -o perfect_number
./perfect_number

완전수 (28) 에 대한 예시 출력:

완전수인지 확인할 양의 정수를 입력하세요: 28
28의 진약수: 1 2 4 7 14

진약수의 합: 28
28는 완전수입니다!

완전수가 아닌 경우 (12) 에 대한 예시 출력:

완전수인지 확인할 양의 정수를 입력하세요: 12
12의 진약수: 1 2 3 4 6

진약수의 합: 16
12는 완전수가 아닙니다.

주요 개선 사항:

  • 이제 모든 진약수를 출력합니다.
  • 진약수의 합을 표시합니다.
  • 명확하고 정형화된 출력을 제공합니다.
  • 완전수 감지의 핵심 논리를 유지합니다.

요약

이 실험에서는 C 언어에서 정수 입력을 받아 숫자가 완전수인지 판별하는 방법을 배웁니다. 먼저, 사용자에게 양의 정수를 입력하도록 요청하는 C 프로그램을 작성합니다. 그런 다음, 숫자의 진약수 (자기 자신을 제외한 약수) 의 합을 계산하고, 이 합을 원래 숫자와 비교하여 완전수인지 확인합니다. 마지막으로, 결과를 콘솔에 출력합니다.

이 실험에서 얻을 수 있는 주요 학습 내용은 scanf()를 사용하여 정수 입력을 받는 방법, for 루프를 사용하여 진약수의 합을 계산하는 방법, 그리고 합을 원래 숫자와 비교하여 완전수인지 판별하는 방법입니다.