[C언어-기초실습-4] 입력 된 수의 약수를 구하세요?

Words
225
Reading
1 min
7y
Listen to this post
~2 min

[C언어-기초실습-4] 입력 된 수의 약수를 구하세요?



입력 된 수를 기준으로 약수들을 구하는 프로그램을 실습해보도록 하죠.

1. 문제의 이해


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

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

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

어제와 동일하지요.

다음으로, 입력 된 수를 기준으로 약수를 구해야 합니다.

inputVal%i ==> 0일 때 i은 약수

이 조건식을 if문으로 해서 1에서 inputVal까지의 수를 비교하면 됩니다. 아래와 같이요.

for(i =1; i<=inputVal1; i++){
        //입력값을 나누어 떨어지는 수 
        if(inputVal%i == 0) printf("%d ", i);        
 }

여기서, 역순으로 for문을 돌리수도 있습니다. 전 역순으로 할께요.

for(i = inputVal; i >= 1; i--){
        //입력값을 나누어 떨어지는 수 
        if(inputVal%i == 0) printf("%d ", i);        
 }
 

이 약수구하기 방식은 for문으로 돌렸습니다.

[while문 방법]

루프니깐 for문 대신에 while문으로 수정해 보았습니다. 루프가 돌아가는 의미만 잘 알고 있다면 어떤 것으로도 충분히 표현이 가능 할 거라 보네요.

 i=inputVal;
  while(i>=1){
        if(inputVal%i == 0) printf("%d ", i);
        i--;        
}

[재귀함수 방법]

int main(){
  printf("재귀함수 %d의 약수: ", inputVal);
  Cal(inputVal,inputVal);
}
//재귀함수를 이용한 약수 구하기 
void Cal(int val, int a){
    if(a==1) printf("%d \n",a);
    else {
        if(val%a == 0) printf("%d ",a);
        Cal(val, a-1);
    }
}

재귀함수는 마지막 조건값이 될 때까지 자기 자신을 재호출한다는 원리를 이용하면 루프문 형태를 만들 수 있습니다. 표현은 위와 같이 할 수 있습니다.

2. 약수 규칙을 이용한 약수 구하기


a1.jpg



a2.jpg

보시는 것처럼 약수는 자기 자신의 수 다음에 자기 자신수의 수를 2로 나눈 수자에서부터 약수가 발생합니다.
그러면 절반이하로 약수를 조건식에서 비교할 필요가 없어지겠죠.

"inputVal/2"의 값을 기준으로 루프를 돌리면 됩니다.

for(i=inputVal/2;i>=1;i--){
    if(inputVal%i == 0) printf("%d ", i);
}

이제 만든 알고리즘을 코딩해보고 실행 결과를 살펴 볼까요.

코딩


[전체소스]

#include 
#include 

void Cal(int val, int a);

int main(int argc, char *argv[]) {
    
    int inputVal;
    int i;
    printf("약수를 구할 정수를 입력하시오? ");
    scanf_s("%d", &inputVal);
    
    //for문을 이용한 약수 구하기 
    printf("for문 %d의 약수: ", inputVal);
    for(i = inputVal; i >= 1; i--){
        //입력값을 나누어 떨어지는 수 
        if(inputVal%i == 0) printf("%d ", i);        
    }
    printf("\n"); 
    
    //while문을 이용한 약수 구하기 
    i=inputVal;
    printf("while문 %d의 약수: ", inputVal);
    while(i>=1){
        if(inputVal%i == 0) printf("%d ", i);
        i--;        
    }
    printf("\n"); 
    
    printf("재귀함수 %d의 약수: ", inputVal);
    Cal(inputVal,inputVal);
    
    //약수규칙을 이용한 방식
    printf("약수규칙 %d의 약수: %d ", inputVal,inputVal);
    for(i=inputVal/2;i>=1;i--){
        if(inputVal%i == 0) printf("%d ", i);
    }
    printf("\n");  
        
    system("pause");
    return 0;
}

//재귀함수를 이용한 약수 구하기 
void Cal(int val, int a){
    if(a==1) printf("%d \n",a);
    else {
        if(val%a == 0) printf("%d ",a);
        Cal(val, a-1);
    }
}

[결과]
a3.jpg

마무리


오늘은 약수를 구하는 코딩을 다양한 방식으로 접근해 보았습니다. 이 방법외에 또 다른 방법을 찾아서 약수를 구하는 프로그램을 완성하세요.


Sponsored ( Powered by dclick )

dclick-imagead

[C언어-기초실습-4] 입력 된 수의 약수를 구하세요? | Ecency