씹어먹는 C언어라는 교재로 공부하고 있습니다.(블로그에 어떤 분이 올리신 책)
2. 유클리드 호제법을 이용해서 N개의 수들의 최대공약수를 구하는 함수를 만들어보세요.
이러한 문제 였습니다. 그래서 배열을 이용해서 코드를 짜서 최종적으로 다 만든 것 같습니다.
유클리드 호제법에 대해서 잠시 설명하자면 두 개의 최대공약수를 구할 때 이러한 방식으로 한다고 합니다.
예를들어 32와 18 이것은
gcd(32,18) 로 쓰고, 유클리드호제법에 따라 한 번 연산을 하면
gcd(18, 14) 가 됩니다.
즉 gcd(a, b) = gcd(b, a %b) 가 되고.
b(오른쪽에 있는 수)가 0이 될 때까지 합니다.
그래서 gcd(k, 0) 이라면 두 수의 최대공약수는 k가 되는 공식입니다.
여러개의 수를 이용해야하기 때문에 유클리드 호제법은 다음과 같은 식을 만족합니다.
예를들어 5개의 경우
gcd(a, b, c, d, e) =
gcd((a, b), (c, d), e) =
gcd(f, g, e) =
gcd((f, g), e) =
gcd(h, e) =
gcd(i ,0) = i
이러한 방식으로 되게끔 코드를 짰습니다.
gcd 한 번 실행한 값들은 새로운 배열로 보내서 저장을 해서
그 새로운 배열을 다시 gcd하는 방법을 이용했습니다.
제가 만든 코드와 결과물은 아래와 같습니다.
(코드가 길어서 짤라서 붙였으니 보시는데 약간 불편함이 있습니다...)
코드가 길어 보기가 어려울 수 도 있겠네요. 여튼 오랜시간동안 공부해서 저렇게 만들긴 했습니다. 다른 숫자에도 잘 작동하는 것 같습니다.
여기서 질문은 제가 저렇게 만들기 전에 코드를 아래와 같이 썼었습니다.
코드 완성 전에, 저기 별표 해놓은 부분이 들어가 있었는데요. (완성된 코드에는 저 코드를 지웠습니다.)
제 생각에는 euclidean 함수에 처음에
if(put_number == 1) return gcd_number[0];
이 코드가 있어서 함수가 종료되고 gcd_number[0] 값을 1로 보낼줄 알았는데
위의 사진과 같이 결과값을 5로 보내고 있습니다.
왜 이렇게 되는지 알고 싶네요.
제 생각에는 if(put_number == 1) return gcd_number[0]; 이게 끝나고 나서도
아래의 여러 명령문을 실행해서 이러한 결과가 나온것 같은데,
그렇게 한다고 가정을 해도 5가 나올 수 없다고 생각하는데 이상하네요..
그리고 맨 마지막에 return gcd_number[0]; 이 코드가 있었을 때
if(put_number == 1) return gcd_number[0]; 에다가 printf("%d", gcd_number[0])을 추가해서 결과값을 보니 1로 맞게 나왔는데
결국에 출력되는 것은 5가 나오니 어떻게 되는지 모르겠습니다...
마지막으로 현재 프로그래밍을 공부한지 이제 5개월이 되가고 있는데
코드를 보고 조언을 해주실게 있다면 해주시면 감사하겠습니다!(__)