인프런 커뮤니티 질문&답변

김인도님의 프로필 이미지
김인도

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

C언어 기출문제의 변형

소수판별기

해결된 질문

작성

·

189

0

  • 1000022775.jpg위 코드가 왜 소수판별기인지 모르겠습니다.

답변 3

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

소수(Prime Number)란 1과 자기 자신만 약수로 가지는 수를 말합니다.

예를 들어 3, 5, 7, 13과 같은 숫자입니다.

https://ko.m.wikipedia.org/wiki/%EC%86%8C%EC%88%98_(%EC%88%98%EB%A1%A0)

우리의 목적은 약수가 1과 자기자신인 수를 반복문을 통해 밝혀내는 것입니다.

 

isP의 함수를 살펴봅시다.

어떤 입력값이 와서 함수를 수행한 후에, return문을 만나면 해당 함수는 값을 반환해버리고 끝나버립니다.

isP 함수에서 목적은 무엇일까요? 우리는 return 1(참)을 받아야 합니다.

약수가 1을 제외하고 하나라도 있으면 0(거짓)을 리턴하고 함수는 종료가 됩니다.

 

예를 들어보겠습니다.

1을 입력 받았다고 합시다. 1은 그 자체로 소수가 아닙니다. 소수가 되려면 1을 포함해서 자기자신이 약수여야 합니다. (예를 들어 7의 경우 1과 7이 자기 자신의 약수) 그래서 첫번째 if문에 걸려 0(거짓)이 리턴됩니다.

 

그 외에 약수가 여러개인 숫자가 뭐가 있을까요? 10이 생각나네요.

10은 약수가 1, 2, 5, 10입니다. 약수가 2개가 아니니까 0(거짓)을 리턴 받아야겠죠?

함수 안의 첫번째 if문을 통과하고 반복문을 만나게 됩니다.

반복문을 해석해보면, 자기 자신(num)보다 작으면서 "2"보다 큰 모든 수를 자기 자신(num)을 나눠서 나머지가 0인 것이 있는지 확인합니다. 나머지가 0이라는 것은 약수라는 뜻입니다. 약수가 발견되자마자 그 즉시 0(거짓)을 반환합니다.

여기에서는 2를 만나면 0을 리턴하고 함수가 끝나겠네요. 2는 10을 나누면서 나머지가 0이기 때문입니다.

 

저 2가지 조건 외에는 모두 소수입니다.

예를 들어 5, 7을 봅시다.

5는 첫번째 if문에도, 두번째 반복문에서도 걸리지 않습니다. 7도 마찬가지이지요?

1도 아니지만, 자기보다 작은 숫자 중에서 본인을 나머지 0으로 나누는 수가 없습니다. (1보다 크면서 자기보다 작은 약수가 없다는 뜻)

 

그래서 isP는 1이 아니면서, 2보다 크면서 자기 자신보다 작은 약수가 있는 경우를 제외하고 모두 1(참)을 리턴합니다.

0

김인도님의 프로필 이미지
김인도
질문자

질문수정이 안되는데

Num이 2일때

2로나눠서 나머지가 0으로

0이반환되는데요.

2는 그럼 소수인데

0이반환되어 오류인듯 합니다.

주말코딩님의 프로필 이미지
주말코딩
지식공유자

for(i=2; i<num; i++)

for문의 초기식에서 i는 2입니다. 그리고 조건식을 보면 2 < 2를 물어봅니다. 해당 조건은 거짓입니다.

그래서 숫자가 2인 경우에는 애초에 isP의 반복문의 조건문에서 거짓으로 판단되어 실행하지 않게되고 return 1이 실행됩니다.

 

그래서 정상적으로 2는 소수로 판별됩니다.

0

안녕하세요, 인프런 AI 인턴입니다.

김인도님의 질문과 유사한 내용이 기존 답변에 포함되어 있어, 이를 기반으로 도움을 드릴 수 있는 링크를 제공해드립니다.

  • 소수판별기 전혀 이해가 안되요에서의 질문이 김인도님의 의문점과 유사하다고 볼 수 있습니다. 소수 판별기에 대한 핵심적인 설명은 다음과 같습니다:

    • 소수는 1과 자기 자신 외에는 어떤 수로도 나누어떨어지지 않는 수를 의미합니다.
    • 소수 판별 알고리즘은 주어진 숫자(num)에 대해, 2부터 (num-1)까지의 모든 숫자로 나누어 보고, 하나라도 0으로 나누어 떨어진다면 그 수는 소수가 아닙니다.
    • 반복문을 통해 주어진 조건(위의 조건)을 만족하는지 검사하여 소수 여부를 판별합니다.
    • 이 과정에서 나머지가 0이 되는 경우가 없다면, 그 수는 소수입니다.

위 링크에서 보다 상세한 설명을 확인하실 수 있으며, 소수 판별기가 작동하는 원리를 이해하는 데 도움이 될 것입니다.

아울러, 질문하신 코드가 명확하게 소수를 판별하는 로직에 대해 잘 이해가 되지 않으시는 경우, 이 부분으로 인하여 혼란을 느꼈을 수 있다는 점을 고려해보시기 바랍니다. 보통 for문을 사용하여 2부터 숫자의 직전까지 순회하여 나누어 떨어지는지를 검사함으로써 소수 여부를 판별합니다. 주어진 코드에서 이런 로직이 어떻게 활용되고 있는지 추가적인 설명이 제공된 링크를 참고해보시면, 코드의 흐름을 이해하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김인도님의 프로필 이미지
김인도

작성한 질문수

질문하기