Practice/알고리즘_백준
2609_최대공약수와 최소공배수(유클리드 알고리즘)
오뀨기
2022. 4. 8. 16:01
https://www.acmicpc.net/problem/2609
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
* 최대공약수 : 공약수 중에서 가장 큰 공약수
-> 두 수 a, b의 최대공약수는 gcd(a, b) 또는 (a, b)로 나타냄
★ 유클리드 알고리즘
- 주어진 두 수 사이에 존재하는 최대공약수(GCD)를 구하는 알고리즘
- GCD : Greatest Common Divisor
- 원리
두 수 a(큰 수), b(작은 수)가 있을 때 'a%b=n'계산
-> n=0 경우 : b가 최대공약수
-> n≠0 경우 : a에 b값을 다시 넣고 n을 b에 대입하여 다시 계산
int gcd(int a, int b) {
int tmp, n;
//a에 큰 값 배치를 위한 반복문
if (a < b) {
tmp = a;
a = b;
b = tmp;
}
//유클리드 알고리즘 부분
//a%b진행(b가 0이 될때까지)
while (b != 0) {
n = a % b;
a = b;
b = n;
}
return a;
}
* 최소공배수 : 공배수 중에서 가장 작은 공배수
-> 두 수 a, b의 최소공배수는 lcm(a, b) 또는 [a, b]로 나타냄
int lcm(int a, int b){
return a * b / gcd(a,b);
}
전체 코드
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a, int b) {
int tmp, n;
//a에 큰 값 배치를 위한 반복문
if (a < b) {
tmp = a;
a = b;
b = tmp;
}
//유클리드 알고리즘 부분
//a%b진행(b가 0이 될때까지)
while (b != 0) {
n = a % b;
a = b;
b = n;
}
return a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int main()
{
int x, y, r1, r2;
cin >> x >> y;
r1 = gcd(x, y);
r2 = lcm(x, y);
cout << r1 << endl << r2;
}