|
안녕하세요...
아래에 나오는 두 프로그램에 대한 것인데요...
에러없이 실행은 잘됩니다...
근데, 제가 프로그램에 대한 이해가 딸리네요....
우선, 첫번째는 1부터 100까지 숫자중에서 소수만 더하는 프로그램입니다...
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int IsPrime(int x){
int i;
for (i=2; i<=x-1; i++)
if ((x%i) == 0)
return FALSE;
return TRUE;
}
void main() {
int i, Sum=0;
for(i=2; i<=100; i++) {
if (IsPrime(i))
Sum+=i;
}
printf("Sum of 소수 : %d\n", Sum);
}
위 소스가 전체적으로 어떻게 돌아가는지는 알겠는데...
int IsPrime(int x){
int i;
for (i=2; i<=x-1; i++)
if ((x%i) == 0)
return FALSE;
return TRUE;
}
위의 부분에서 int x는 main에서 IsPrime(i)로 받은
i값이잖아요...그럼...main에서 i의 초기값이 2이므로
결국 함수 IsPrime의 x변수에는 2가 저장이 됩니다...
2는 소수입니다...
그런데....함수 IsPrime의 for문에서
for (i=2; i<=x-1; i++)의 종료값이 i<=x-1이니까...
즉, 2 <= 2-1 이 되므로 조건이 성립되지 않아서...
실행할수가 없지 않나요...
그리고 숫자 4의 경우
함수 IsPrime는 다시 불리는 것이니까..
i값은 2가 되고 2<= 4-1이니까...
그 다음 문장을 실행해 4%2는 떨어지므로...
false를 return하고 해당 함수를 빠져나갑니다..
이렇게 볼때 한번에 소수여부를 알수 있는데,
for문을 이용하니까 할수 없는 거지만...
사실, 함수 IsPrime의 for문의 i++은 무의미하지않나요?
두번째는 정수값 2개를 입력받아서 첫번째 값에 두번째 수만큼 곱하는 것으로 재귀함수를 이용하였습니다...
#include <stdio.h>
int power(int a, int b)
{
int y;
if (b==1)
return a;
else {
y=power(a,b/2);
printf("%d\n",y);
if ((b%2)==1)
return a*y*y;
else
return y*y;
}
}
void main()
{
int a;
int b;
int nCount;
nCount = scanf("%d%d",&a,&b);
while (nCount < 2) {
printf("%s\n","정수값 2개를 입력하셔야 합니다.");
nCount = scanf("%d%d",&a,&b);
}
printf("%d의 %d제곱은 %d입니다.\n",a,b,power(a,b));
}
위의 소스에서
else {
y=power(a,b/2);
printf("%d\n",y);
if ((b%2)==1)
return a*y*y;
else
return y*y;
}
위 부분이 이해가 안되네요...
정수값이 2와 1이 들어오면 두번째값 b가 곱하나마나한
1이므로 그냥 첫번째 값을 그대로 반환해 줍니다...
그렇지만...다른 경우 예를 들어 정수값이 2 와 2일때..
두번째값 b가 1이 아니므로 else문을 수행하고
다시 y=power(a,b/2); 와 같이 함수를 부르지요
y=power(2,1) 이 넘어가면 b는 1이니까...
정수값 2와 1일경우와 똑같지 않나요
글고 2와 4일경우에는
y=power(2,2)로 두번째값 b가 1이 아니므로
else로 오는데...if문에서 b%2하면 0이 되므로..
짝수인데....짝수면...y*y...
y=power(2,2)인데 도대체 어떻게 곱해야 할지..
제가 프로그램 순서를 잘못 이해하고 있는건지...
내용이 너무 길어서 읽으시다가 화가 날지도...--;;
그래도 아시는 분이 답글 올려주시면 고맙겠습니다.
그럼....안녕히...
|