최대공약수를 구할때는 "유클리드 호제법"을 사용하는것이 편하다.
유클리드 호제법이란? 단순하게 설명해서
1. 큰 수에서 작은 수를 나눈 나머지를 구한다.(큰 수 작은 수의 구분은 크게 의미가 없고 단지 먼저수와 나중수의 의미가 크다.)
2. 작은 수가 큰 수, 나머지가 작은 수의 역활을 하여 1의 과정을 다시한다.
3. 2의 과정을 하다가 나머지가 0 이며 종료한다.
4. 마지막으로 나눈 값이 최대공약수 이다.
그럼 최소공배수는 어떻게 구하나?
최대공약수로 처음의 큰 수와 작은 수의 곱을 나누면 된다.
큰수 * 작은수 / 최대공약수
예)두수를 입력받아서 최대공약수와 최소공배수 구하기
소스)
int EU(int x, int y)
{
int n;
while (1){
n = x % y;
if (n == 0) return y;
x = y;
y = n;
}
}
int main()
{
int gcm, lcm, su1, su2;
scanf("%d %d",&su1, &su2);
gcm = EU(su1, su2);
lcm = su1 * su2 / gcm;
printf("최대공약수 = %d\n", gcm);
printf("최소공배수 = %d\n", lcm);
return 0;
}
그럼 3개 이상의 수에서는 어떻게 구할까?
1. 처음 하나의 숫자를 최대공약수와 최소공배수로 정의한다. (숫자가 하나 일 때는 그 수가 최대공약수, 최소공배수이기 때문이다.)
2. 지금까지 구해놓은 최대공약수와 새로운 수로 최대공약수를 구한다.
3. 또 지금까지 구해놓은 최소 공배수와 새로운 수로 최소공배수를 구한다. 주의 - 최소공배수 * 새로운 수를 나눌때는 지금 곱하는 두 수의 최대공약수로 나누어야한다.
4. 2, 3 과정을 모든 숫자가 끝날때까지 반복한다.
예) 5개의 숫자를 입력 받아 최대공약수와 최소공배구수 구하기
소스)
int EU(int x, int y)
{
int n;
while (1){
n = x % y;
if (n == 0) return y;
x = y;
y = n;
}
}
int main()
{
int gcm, lcm, su, i;
scanf("%d",&su);
gcm = lcm = su;
for(i=1; i<5; i++){
scanf("%d",&su);
gcm = EU(gcm, su);
lcm = lcm * su / EU(lcm, su);
}
printf("최대공약수 = %d\n", gcm);
printf("최소공배수 = %d\n", lcm);
return 0;
}
'C/C++기초' 카테고리의 다른 글
| 비트 연산자, AND OR XOR NOT 쉬프트 연산자를 알아보자 (2) | 2010.10.04 |
|---|---|
| 하노이의 탑 (0) | 2010.09.28 |
| 삽입정렬(Insertion sort) - 삽입정렬을 구현해보자 (0) | 2010.09.18 |
| 버블정렬(거품정렬 : Bubble sort) - C++로 버블정렬 하는 방법을 알아보자. (2) | 2010.09.11 |
| 선택정렬(Selection sort) - C++로 선택정렬을 구현해보자 (3) | 2010.09.10 |


