#include <iostream>
#include <cmath>
using namespace std;
int GetGDC(unsigned n1, unsigned n2);
int GetLCM(unsigned n1, unsigned n2);
int main(void)
{
unsigned n1, n2; // 자연수 두개
unsigned maxFactor; // 최대 공약수 저장용 변수
unsigned minMultiple;// 최소 공배수 저장용 변수
// 최대 공약수, 최소 공배수 초기화
maxFactor = minMultiple = 1;
// 두 개의 자연수를 입력 받는다.
cin >> n1 >> n2;
// 각 함수를 이용하여 최대공약수와 최소공배수를 찾는다.
maxFactor = GetGDC(n1, n2);
minMultiple = GetLCM(n1, n2);
// 결과 출력
cout << maxFactor << endl;
cout << minMultiple << endl;
}
// 최대 공약수(GCD) 찾기
int GetGDC(unsigned n1, unsigned n2)
{
// 반복문 사용
//unsigned smallN = (n1 < n2) ? n1 : n2;
//for (int i = 1; i <= smallN; ++i)
//{
// // 두 수 모두 나눠지면 두 수의 공약수
// // i가 증가하므로 나중에 대입되는 값이 더 큰 공약수일 것
// maxFactor = (n1 % i == 0 && n2 % i == 0) ? i : maxFactor;
//}
// 유클리드 호제법 사용
// r = n1 % n2 일때, n1과 n2와 최대 공약수는 n2와 r의 최대 공약수와 같다.
//unsigned r;
//while (true)
//{
// r = n1 % n2;
// if (r == 0)
// break;
// n1 = n2;
// n2 = r;
//}
//return n2;
// 유클리드 호제법 재귀 함수 사용
unsigned r = n1 % n2;
if (r == 0)
return n2;
return GetGDC(n2, r);
}
// 최소 공배수(LCM) 찾기
int GetLCM(unsigned n1, unsigned n2)
{
unsigned bigN = (n1 > n2) ? n1 : n2;
for (int i = bigN; ; ++i)
{
// 두 수의 공통된 배수가 되어야 하므로 최소한 큰 자연수와 같은 값이 올 것
// i를 두 수로 나눴을 때 모두 나머지가 0 이면 공배수
// 가장 먼저 등장한 것이 최소 공배수가 될 것
if (i%n1 == 0 && i % n2 == 0)
{
return i;
}
}
}