두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.
첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
24 18
6
72
//---- 세팅 ----//
const fs = require('fs');
const stdin = (
process.platform === 'linux'
? fs.readFileSync('/dev/stdin').toString()
: `\
24 18
`
).split('\n');
const input = (() => {
let line = 0;
return () => stdin[line++];
})();
//---- 풀이 -----//
const [a, b] = input().split(' ').map(Number);
const gcd = (a, b) => {
let res = 1;
for (let i = 1; i <= Math.min(a, b); i++) {
if (a % i === 0 && b % i === 0) res = i;
}
return res;
};
const lcm = (a, b) => {
return (a * b) / gcd(a, b);
};
console.log(gcd(a, b));
console.log(lcm(a, b));
A
와 B
의 공통된 약수 중에 가장 큰 정수이다.2
부터 min(A, B)
까지 모든 정수로 나누어보는 방법이다.a
, b
의 최대공약수를 gcd
라고 했을 때, 최소공배수 lcm = gcd * (a/gcd) * (b/gcd)
이다.a * b = gcd * lcm
과 같다는 원리를 이용하는 것이다.lcm = (a*b) / gcd
이다.// 최대공약수
function gcd(a, b) {
let res = 1;
for (let i = 1; i <= Math.min(a, b); i++) {
if (a % i === 0 && b % i === 0) res = i;
}
return res;
}
// 최소공배수
function lcm(a, b) {
return (a * b) / gcd(a, b);
}
console.log(gcd(3, 12), lcm(3, 12)); // 3 12