소개
이 실습에서는 주어진 숫자가 완전수인지 확인하는 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 == 0은i가 숫자의 약수인지 확인합니다.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 루프를 사용하여 진약수의 합을 계산하는 방법, 그리고 합을 원래 숫자와 비교하여 완전수인지 판별하는 방법입니다.



