C언어 문제
사용자에게 정수 2개를 입력받아 최대공약수를 찾는 함수 gcd를 작성하시오.
*재귀호출과 반복문 두 가지 방법 모두 구현하기
1.main 함수
scanf함수를 통해 두 정수를 입력받는다.
두 정수를 findGCD함수에 인자로 넣어 remin에 최대공약수를 리턴값으로 받는다.
최대 공약수를 출력한다.
2.최대공약수 구하는 함수
①findGCD 함수 - 재귀호출 함수
함수의 타입을 int로 잡는다. return값을 최대공약수로 받기 위해서 이다.
인자는 main함수에서 입력받은 두 정수를 넣어준다.
최대공약수를 구하는 방법은 유클리드의 호제법을 사용한다.
유클리드의 호제법은 두 정수가 있을 때 큰 수를 작은 수로 나눈다. 나눈 나머지가 0이라면 두 정수의 최대공약수는 작은 수(작은 수)이다. 나머지가 0이 아니라면 원래 있던 큰 수는 버리고 작은 수와 나머지만 생각한다. 작은 수를 나머지로 나누고 나머지가 0이라면 최대공약수는 나머지가 된다. 그렇지 않다면 이 과정을 반복한다.
(참고 위키 백과 유클리드 호제법 - https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95)
재귀함수는 return 값이 자신 함수를 가진다. 호제법에서는 나머지에 따라 반복적인 행위를 계속해야하기 때문에 재귀함수를 사용할 수 있다.
인자로 받은 두 정수를 큰 수와 작은 수로 구분해 주고 큰 수를 작은 수로 나눈다. 이 때 나머지를 re라는 변수에 담는다. if - else문으로 re가 0이 아닐 때와 0일 때의 경우로 나눈다. 0이 아니라면 findGCD를 반복해야 하기 때문에 return 값은 findGCD(작은 수, 나머지)가 된다.
0일 경우는 나눈 수가 나머지이기 때문에 return 값은 작은 수가 된다.
<전체 코드>
②findGCD 함수 - 반복문 사용
유클리드 호제법은 위에서 사용했기 때문에 다른 방법을 사용해 보겠다.(하지만 숫자가 커지면 이 방법보다는 호제법이 훨씬 연산 정도가 적다.)
두 정수 중 큰 수와 작은 수를 정리한다. 그리고 작은 수와 같은 값을 가진 변수(i)를 이용해 입력 받은 두 수를 모두 변수(i)로 나눈다. 이때 나머지가 모두 0일 때 i는 최대공약수이며 모두 0이 아니라면 i를 1감소시킨다. 이 과정이 반복되어 i가 1이 되면 반복을 멈추고 i를 출력한다.
<전체코드>
**유클리드의 호제법을 반복문으로 구현하기
큰 수를 작은 수로 나눴을 때 나머지가 0일 경우에 반복문을 빠져나와 최소공배수를 return한다.
댓글
댓글 쓰기