다시 C언어 실습 시간이 되었습니다. 입력 된 수까지의 소수를 구하는 프로그램을 실습 하도록 하죠.
소수란 "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);
}
지난 코드를 떠올리면 소수 코딩으로 만들어 보세요.
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);
}
}
억지로 재귀함수로 코딩했지만 이런 표현은 재귀적 느낌의 함수라고 하긴 좀 그렇네요.
이제 위 코딩들을 실제 코딩해보고 실행 결과로 정상적으로 출력되는지 살펴 봅시다.
[전체소스]
#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);
}
}
[결과]
약수와 짝을 이루는 소수를 구하는 코딩을 해 보았습니다. 최근 실습 코딩을 보면 거의 수학이네요. 수학 코딩을 하려고 했던 건 아니지만 수학 코딩이 되었네요. 암튼 억지로지만 다양한 형태로 코딩을 하고 있습니다. 이 코딩은 뭐랄까 계속 감각을 키우는 코딩이기 때문에 이렇게 계속 연습하셔야 합니다.
아무튼 꾸준히 이런식으로 연습하다 보면 나중에 하나의 원리를 깨우치면 다양한 각도로 코딩을 할 수 있습니다.
추가로, 여러분들은 입력 된 수가 소수인지 아닌지 체크하는 코딩을 한번 도전해 보세요. 힌트는 for문 j의 코딩은 그대로 유지하고 i의 값만 하나 입력 수의 기준으로 체크하시면 됩니다. 즉, for문 j만 돌려서 소수인지만 체크하면 됩니다. 위 소스에서 약간만 수정하시면 쉽게 현재 입력 된 수가 소수인지 판별을 할 수 있습니다.