공부/C++
[C++] 유클리드 호제법을 사용해 최대공약수 구하기
WSLim_97
2024. 1. 19. 20:58
반응형
유클리드 호제법
유클리드 호제법이란 2개의 자연수를 이용해 최대공약수를 구하는 알고리즘이다.
유클리드 호제법을 사용해 최대공약수를 구하는 방법
- 두 자연수를 각각 a와 b라고 하고 a >= b 일 때
- a % b = c 계산을 한다.
- c가 0이 아니라면 b % c 계산을 진행한다.
- 나머지 값이 0이 될 때까지 반복한다.
- 나머지 값이 0이 되었을 때 나누는 수의 값이 두 자연수의 최대공약수이다.
예시) 78696와 19332의 최대공약수 구하기 / 최대공약수는 36이다.
78696 = 19332×4 + 1368
19332 = 1368×14 + 180
1368 = 180×7 + 108
180 = 108×1 + 72
108 = 72×1 + 36
72 = 36×2 + 0
출처) 위키백과
최대공약수 구하기
유클리드 호제법을 통해 최대공약수를 구하는 코드를 작성해 본다.
#include <iostream>
using namespace std;
int divisor(int x, int y) { // 최대공약수
int z = x % y;
while (z != 0) {
x = y;
y = z;
z = x % y;
}
return y;
}
int main() {
int a, b, div, temp;
cin >> a >> b;
if (a < b) // a가 b보다 작을경우 a와 b의 값을 바꾼다.
{
temp = a;
a = b;
b = temp;
}
div = divisor(a, b);
cout << "a의 값: " << a << " b의 값: " << b << endl;
cout << div;
return 0;
}
a의 값이 b보다 크거나 같아야 하므로 a가 b보다 작을 때 a와 b의 값을 바꾸는 코드를 추가하였다.
+) a의 값이 b보다 작은 경우
최소공배수 구하기
유클리드 호제법을 통해 최대공약수를 구했다면 최대공약수를 이용해 최소공배수도 구할 수 있다.
두 수의 곱 = 최대공약수 * 최소공배수이다.
따라서 최소공배수 = ( 두 수의 곱 ) / 최대공약수이다. 이를 통해 최소공배수를 구하는 코드를 작성해 본다.
#include <iostream>
using namespace std;
int divisor(int x, int y) { // 최대공약수
int z = x % y;
while (z != 0) {
x = y;
y = z;
z = x % y;
}
return y;
}
int multiple(int x, int y) { // 최소공배수
return (x * y) / divisor(x, y);
}
int main() {
int a, b, div, mul, temp; // div 최대공약수 mul 최소공배수
cin >> a >> b;
if (a < b) // a가 b보다 작을경우 a와 b의 값을 바꾼다.
{
temp = a;
a = b;
b = temp;
}
div = divisor(a, b);
mul = multiple(a, b);
cout << "a의 값: " << a << " b의 값: " << b << endl;
cout << "최대공약수: " << div << ", 최소공배수: " << mul << endl;
return 0;
}
결과)
반응형