ฟังก์ชันนี้รับอาร์เรย์ของคู่ตัวเลข [numerator, denominator] แทนเศษส่วน แล้วคำนวณผลรวมในรูปเศษส่วน (ไม่แปลงเป็นทศนิยม)
ตัวอย่าง
// Input: [[12, 56], [3, 45], [23, 2], [2, 6], [2, 8]] // 12/56 + 3/45 + 23/2 + 2/6 + 2/8 // Output: [1731, 140] (คือ 1731/140)
ตัวอย่างโค้ด
const arr = [[12, 56], [3, 45], [23, 2], [2, 6], [2, 8]];
// หาตัวหารร่วมมาก (GCD) แบบ brute force
const gcd = (a, b) => {
let num = 2, res = 1;
while (num <= Math.min(a, b)) {
if (a % num === 0 && b % num === 0) {
res = num;
}
num++;
}
return res;
};
// บวกเศษส่วน 2 ตัว
const sumFrac = (a, b) => {
const [aNumer, aDenom] = a;
const [bNumer, bDenom] = b;
let resDenom = aDenom * bDenom;
let resNumer = aDenom * bNumer + bDenom * aNumer;
const greatestDivisor = gcd(resDenom, resNumer);
return [resNumer / greatestDivisor, resDenom / greatestDivisor];
};
// บวกเศษส่วนทั้งหมดในอาร์เรย์
const sumArrayOfFractions = arr => arr.reduce((acc, val) => sumFrac(acc, val));
console.log(sumArrayOfFractions(arr));
ขั้นตอนการคำนวณ
- หาตัวหารร่วมมาก (GCD) เพื่อลดรูปเศษส่วน
- บวกเศษส่วน 2 ตัว: a/b + c/d = (ad + bc) / bd
- ลดรูปด้วย GCD
- ใช้
reduce()บวกทีละตัว
ผลลัพธ์
[ 1731, 140 ]
หมายเหตุ: GCD แบบ brute force ช้า สำหรับตัวเลขใหญ่ควรใช้ Euclidean algorithm