[C언어-기초실습-4] 입력 된 수의 약수를 구하세요?
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php
입력 된 수를 기준으로 약수들을 구하는 프로그램을 실습해보도록 하죠.
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. 약수 규칙을 이용한 약수 구하기
보시는 것처럼 약수는 자기 자신의 수 다음에 자기 자신수의 수를 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);
}
}
[결과]
마무리
오늘은 약수를 구하는 코딩을 다양한 방식으로 접근해 보았습니다. 이 방법외에 또 다른 방법을 찾아서 약수를 구하는 프로그램을 완성하세요.