C 언어로 숫자가 소수인지 확인하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍에서 숫자가 소수인지 확인하는 방법을 배웁니다. 이 실습은 세 단계로 구성됩니다. 사용자로부터 정수 입력을 받고, 2 부터 입력 숫자의 제곱근까지의 수로 나누어지는지 검사하고, 숫자가 소수인지 아닌지 출력하는 것입니다. 이 실습을 마치면 주어진 정수의 소수성을 판별할 수 있는 작동하는 프로그램을 갖게 될 것입니다.

이 실습은 scanf() 함수를 사용하여 사용자로부터 정수 입력을 받는 방법을 가르치면서 시작합니다. 그런 다음 입력 숫자의 제곱근까지 2 부터 나누어지는지 검사하는 소수 판별 알고리즘을 소개합니다. 나누어지는 수가 없으면 숫자는 소수로 간주됩니다. 마지막으로 프로그램은 숫자가 소수인지 아닌지 나타내는 결과를 출력합니다.

정수 입력

이 단계에서는 C 프로그래밍에서 사용자로부터 정수 입력을 받는 방법을 배웁니다. 이것은 소수 검사 프로그램을 만드는 첫 번째 단계입니다.

먼저 소수 검사 프로그램을 위한 새로운 C 파일을 생성해 봅시다.

cd ~/project
nano prime_checker.c

이제 정수를 읽는 코드를 작성해 봅시다.

#include <stdio.h>

int main() {
    int number;

    printf("소수 여부를 확인할 양의 정수를 입력하세요: ");
    scanf("%d", &number);

    printf("입력한 숫자: %d\n", number);

    return 0;
}

예시 출력:

소수 여부를 확인할 양의 정수를 입력하세요: 17
입력한 숫자: 17

코드를 자세히 살펴보겠습니다.

  • #include <stdio.h>는 표준 입력/출력 라이브러리를 포함합니다.
  • int main()은 프로그램 실행이 시작되는 주 함수입니다.
  • int number;는 사용자 입력을 저장할 정수 변수를 선언합니다.
  • printf()는 사용자에게 프롬프트를 표시합니다.
  • scanf()는 사용자로부터 정수 입력을 읽어 number에 저장합니다.
  • printf()는 사용자가 입력한 숫자를 확인합니다.

프로그램을 컴파일하고 실행해 봅시다.

gcc prime_checker.c -o prime_checker
./prime_checker

2 부터 √n 까지의 나누어 떨어짐 검사

이 단계에서는 입력 숫자의 제곱근까지 2 부터 나누어 떨어지는지 검사하여 소수 판별 알고리즘을 구현합니다.

이전 C 프로그램을 수정하여 소수 판별 논리를 추가해 봅시다.

nano ~/project/prime_checker.c

나누어 떨어짐 검사를 추가한 코드는 다음과 같습니다.

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

int is_prime(int number) {
    // 2 보다 작은 수는 소수가 아닙니다.
    if (number < 2) {
        return 0;
    }

    // 2 부터 숫자의 제곱근까지 나누어 떨어지는지 검사
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // 나누어 떨어지면 소수가 아닙니다.
        }
    }

    return 1; // 나누어 떨어지는 수가 없으면 소수입니다.
}

int main() {
    int number;

    printf("소수 여부를 확인할 양의 정수를 입력하세요: ");
    scanf("%d", &number);

    if (is_prime(number)) {
        printf("%d은 소수입니다.\n", number);
    } else {
        printf("%d은 소수가 아닙니다.\n", number);
    }

    return 0;
}

수학 라이브러리와 함께 프로그램을 컴파일합니다.

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

예시 출력:

소수 여부를 확인할 양의 정수를 입력하세요: 17
17은 소수입니다.

소수 여부를 확인할 양의 정수를 입력하세요: 20
20은 소수가 아닙니다.

구현에 대한 주요 내용:

  • <math.h>sqrt() 함수는 제곱근을 계산합니다.
  • 알고리즘을 최적화하기 위해 √n 까지의 나누어 떨어짐만 검사합니다.
  • 나누어 떨어지는 수가 없으면 숫자는 소수입니다.
  • 나머지 연산자 %는 나누어 떨어지는지 확인합니다.
  • 소수가 아니면 0 을, 소수이면 1 을 반환합니다.

소수 여부 출력

이 마지막 단계에서는 소수 판별 프로그램을 개선하여 더 자세한 출력을 제공하고 여러 숫자를 검사할 수 있도록 합니다.

프로그램을 수정하여 더 포괄적인 출력을 제공해 봅시다.

nano ~/project/prime_checker.c

개선된 인터페이스를 가진 코드를 업데이트합니다.

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

int is_prime(int number) {
    // 2 보다 작은 수는 소수가 아닙니다.
    if (number < 2) {
        return 0;
    }

    // 2 부터 숫자의 제곱근까지 나누어 떨어지는지 검사
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // 나누어 떨어지면 소수가 아닙니다.
        }
    }

    return 1; // 나누어 떨어지는 수가 없으면 소수입니다.
}

void print_prime_details(int number) {
    if (is_prime(number)) {
        printf("%d은 (는) 소수입니다!\n", number);
        printf("설명:\n");
        printf("- 1 과 자기 자신으로만 나누어집니다.\n");
        printf("- 2 와 √%d 사이에 다른 약수가 없습니다.\n", number);
    } else {
        printf("%d은 (는) 소수가 아닙니다.\n", number);

        // 가장 작은 약수를 찾아 출력
        for (int i = 2; i <= sqrt(number); i++) {
            if (number % i == 0) {
                printf("설명:\n");
                printf("- %d로 나누어집니다.\n", i);
                printf("- %d × %d = %d\n", i, number / i, number);
                break;
            }
        }
    }
}

int main() {
    int number, continue_check;

    do {
        printf("소수 여부를 확인할 양의 정수를 입력하세요: ");
        scanf("%d", &number);

        print_prime_details(number);

        printf("\n다른 숫자를 확인하시겠습니까? (1=예, 0=아니오): ");
        scanf("%d", &continue_check);
    } while (continue_check == 1);

    printf("소수 판별기를 사용해 주셔서 감사합니다!\n");

    return 0;
}

프로그램을 컴파일합니다.

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

예시 출력:

소수 여부를 확인할 양의 정수를 입력하세요: 17
17은(는) 소수입니다!
설명:
- 1과 자기 자신으로만 나누어집니다.
- 2와 √17 사이에 다른 약수가 없습니다.

다른 숫자를 확인하시겠습니까? (1=예, 0=아니오): 1

소수 여부를 확인할 양의 정수를 입력하세요: 20
20은(는) 소수가 아닙니다.
설명:
- 2로 나누어집니다.
- 2 × 10 = 20

다른 숫자를 확인하시겠습니까? (1=예, 0=아니오): 0
소수 판별기를 사용해 주셔서 감사합니다!

주요 개선 사항:

  • 소수와 소수가 아닌 경우에 대한 자세한 설명을 추가했습니다.
  • 여러 숫자를 검사할 수 있도록 반복문을 구현했습니다.
  • 숫자의 성질에 대한 더 교육적인 출력을 제공합니다.

요약

이 실험에서는 C 프로그래밍에서 사용자로부터 정수 입력을 받는 방법을 배웠습니다. 이는 소수 판별기를 만드는 첫 번째 단계입니다. 그런 다음 입력 숫자의 제곱근까지 2 부터 나누어 떨어지는지 검사하여 소수 판별 알고리즘을 구현했습니다. 이 프로그램은 주어진 숫자가 소수인지 확인하기 위해 2 부터 해당 숫자의 제곱근까지의 숫자를 반복하여 숫자를 나누었을 때 나머지가 0 인지 확인합니다. 나누어 떨어지는 수가 없으면 해당 숫자는 소수로 간주됩니다.