분수 A/B는 분자가 A, 분모가 B인 분수를 의미한다. A와 B는 모두 자연수라고 하자.
두 분수의 합 또한 분수로 표현할 수 있다. 두 분수가 주어졌을 때, 그 합을 기약분수의 형태로 구하는 프로그램을 작성하시오. 기약분수란 더 이상 약분되지 않는 분수를 의미한다.
첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.
첫째 줄에 구하고자 하는 기약분수의 분자와 분모를 뜻하는 두 개의 자연수를 빈 칸을 사이에 두고 순서대로 출력한다.
2 7
3 5
31 35
const fs = require('fs');
let input = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
let A = 0;
let B = 0;
for (let i = 0; i < 2; i++) {
input[i] = input[i].trim().split(' ').map(Number);
}
function LCM(num1, num2) {
for (let i = 1; ; i++) {
if ((num1 * i) % num2 === 0) return num1 * i;
}
}
let mul = LCM(input[0][1], input[1][1]);
input[0][0] *= mul / input[0][1];
input[0][1] = mul;
input[1][0] *= mul / input[1][1];
input[1][1] = mul;
function GCD(num1, num2) {
let min = Math.min(num1, num2);
for (let i = 2; i <= min; i++) {
if (num1 % i === 0 && num2 % i === 0) {
num1 /= i;
num2 /= i;
i--;
min = Math.min(num1, num2);
}
}
return [num1, num2];
}
console.log(GCD(input[0][0] + input[1][0], input[0][1]).join(' '));
최소공배수랑 최대공배수만 구현할 수 있다면 대부분 분수를 더하는 과정은 알고있기에 쉽게 풀 수 있는 문제 실버3치고는 쉬운 문제였던 것 같다.