[C언어-기초실습-5] 입력 된 수까지의 소수를 구하세요?

Words
347
Reading
2 min
7y
Listen to this post
~2 min

[C언어-기초실습-5] 입력 된 수까지의 소수를 구하세요?



다시 C언어 실습 시간이 되었습니다. 입력 된 수까지의 소수를 구하는 프로그램을 실습 하도록 하죠.

1. 문제의 이해


소수란 "1보다 크고 1과 자신만으로 나누어 떨어지는 수"를 말합니다. 풀이하면은 어떤 수 A를 n까지의 수로 나눌 때 나머지가 0이고 A와 n이 같을 수 소수라고 합니다.

이고 A

약수란 "어떤 수나 식을 나누어 나머지가 없이 떨어지는 수나 식"(사전) 이라고 정의를 내리고 있습니다. 쉽게 말해서 어떤 수 A를 n의 수로 나눌 때 나머지가 0일 때 이때 n은 A의 약수라고 말할 수 있습니다.

먼저 숫자를 하나 입력을 받기 때문에 scanf()함수를 사용합니다.

int inputVal;
scanf("%d",&inputVal);

어제와 동일하지요.

다음으로, 2부터 입력 된 수까지의 수 중 어떤 수가 소수 인지 찾아야 합니다.

2부터 inputVal(입력수)까지의 루프를 돕니다. 이때 각 수를 기준으로 j가 2부터 각 n수까지 루프를 돌때 나누어 떨어지는 수를 찾게 됩니다. 이때 찾을 때 break문으로 빠져 나오게 됩니다. break문으로 마져 나오는 수는 나누어 떨어지는 첫번째 수입니다. 즉, 이 수가 i와 비교해서 자기 자신의 수이면 소수이고 아니면 소수가 됩니다.

 for(i=2;i<=inputVal;i++){
        for(j=2;j<=i;j++){
            if(i%j == 0) break;
    }
        if(i==j) printf("%d ", i);        
 }

위 코딩은 정순이라고 하면 역순으로도 코딩 할 수 있습니다.

for(i=inputVal;i>=2;i--){
        for(j=2;j<=i;j++){
            if(i%j == 0) break;
        }
        if(i==j) printf("%d ", i);        
 }

[while문 방법]

지난 코드를 떠올리면 소수 코딩으로 만들어 보세요.

i=inputVal;    
printf("while문 %d의 소수: ", inputVal);
while(i>=2){
        j=2;
        while(j<=i){
            if(i%j == 0) break;
            j++;
        }       
        if(i==j) printf("%d ", i);        
        i--;                
}

while문은 for문에 비해 귀찮게 코딩이 되었네요. 이런류의 코딩은 while문으로 표현하는 것보다 for문으로 코딩하는게 더 좋겠죠.

[재귀함수 방법]

재귀함수도 지난 소스에서 소수 찾는 코딩으로 변경해 봅시다.

int void(){
    printf("재귀함수 %d의 소수: ", inputVal);
    Cal(inputVal);
}
//재귀함수를 이용한 소수 구하기 
void Cal(int val){
    int chk;
    if(val==2) printf("%d \n",val);
    else {      
        for(chk=2;chk<=val;chk++){
            if(val%chk == 0) break;
        }
        if(val==chk) printf("%d ", chk);        
        Cal(val-1);
    }
}

억지로 재귀함수로 코딩했지만 이런 표현은 재귀적 느낌의 함수라고 하긴 좀 그렇네요.

2. 코딩


이제 위 코딩들을 실제 코딩해보고 실행 결과로 정상적으로 출력되는지 살펴 봅시다.

[전체소스]

#include 
#include 

void Cal(int val);

int main(int argc, char *argv[]) {
    
    int inputVal;
    int i,j;
    printf("소수를 구할 정수를 입력하시오? ");
    scanf_s("%d", &inputVal);
    
    //for문을 이용한 소수 구하기 (정순) 
    printf("정순 for문 %d의 소수: ", inputVal);
    for(i=2;i<=inputVal;i++){
        for(j=2;j<=i;j++){
            if(i%j == 0) break;
        }
        if(i==j) printf("%d ", i);        
    }
    printf("\n"); 
    
    //for문을 이용한 소수 구하기 (역순)
    printf("역순 for문 %d의 소수: ", inputVal);
    for(i=inputVal;i>=2;i--){
        for(j=2;j<=i;j++){
            if(i%j == 0) break;
        }
        if(i==j) printf("%d ", i);        
    }
    printf("\n"); 
    
        
    //while문을 이용한 소수 구하기 
    i=inputVal;    
    printf("while문 %d의 소수: ", inputVal);
    while(i>=2){
        j=2;
        while(j<=i){
            if(i%j == 0) break;
            j++;
        }       
        if(i==j) printf("%d ", i);        
        i--;                
    }
    printf("\n"); 
    
    
    printf("재귀함수 %d의 소수: ", inputVal);
    Cal(inputVal);
    
    system("pause");
    return 0;
}

//재귀함수를 이용한 소수 구하기 
void Cal(int val){
    int chk;
    if(val==2) printf("%d \n",val);
    else {      
        for(chk=2;chk<=val;chk++){
            if(val%chk == 0) break;
        }
        if(val==chk) printf("%d ", chk);        
        Cal(val-1);
    }
}

[결과]
a1.jpg

마무리


약수와 짝을 이루는 소수를 구하는 코딩을 해 보았습니다. 최근 실습 코딩을 보면 거의 수학이네요. 수학 코딩을 하려고 했던 건 아니지만 수학 코딩이 되었네요. 암튼 억지로지만 다양한 형태로 코딩을 하고 있습니다. 이 코딩은 뭐랄까 계속 감각을 키우는 코딩이기 때문에 이렇게 계속 연습하셔야 합니다.
아무튼 꾸준히 이런식으로 연습하다 보면 나중에 하나의 원리를 깨우치면 다양한 각도로 코딩을 할 수 있습니다.

추가로, 여러분들은 입력 된 수가 소수인지 아닌지 체크하는 코딩을 한번 도전해 보세요. 힌트는 for문 j의 코딩은 그대로 유지하고 i의 값만 하나 입력 수의 기준으로 체크하시면 됩니다. 즉, for문 j만 돌려서 소수인지만 체크하면 됩니다. 위 소스에서 약간만 수정하시면 쉽게 현재 입력 된 수가 소수인지 판별을 할 수 있습니다.


Sponsored ( Powered by dclick )

dclick-imagead

[C언어-기초실습-5] 입력 된 수까지의 소수를 구하세요? | Ecency