Cho mảng các cặp số [[a, b], [c, d], ...] đại diện cho các phân số a/b, c/d, .... Tính tổng của tất cả phân số và trả về kết quả dưới dạng phân số tối giản [tử, mẫu].
Ví dụ
Mảng: [[12, 56], [3, 45], [23, 2], [2, 6], [2, 8]]
Giải pháp
Mã triển khai với hàm UCLN (GCD) và cộng phân số:
const arr = [[12, 56], [3, 45], [23, 2], [2, 6], [2, 8]];
// Hàm tìm UCLN (Euclid)
const gcd = (a, b) => {
while (b) {
[a, b] = [b, a % b];
}
return a;
};
// Cộng 2 phân số a/b + c/d = (ad + bc) / bd
const sumFrac = (a, b) => {
const [aNumer, aDenom] = a;
const [bNumer, bDenom] = b;
let resNumer = aNumer * bDenom + bNumer * aDenom;
let resDenom = aDenom * bDenom;
const divisor = gcd(resNumer, resDenom);
return [resNumer / divisor, resDenom / divisor];
};
// Cộng tất cả phân số trong mảng
const sumArrayOfFractions = arr => arr.reduce((acc, val) => sumFrac(acc, val));
console.log(sumArrayOfFractions(arr));
Kết quả
Đầu ra trong console:
[1731, 140]
Giải thích: Tổng = 1731/140 ≈ 12.364. Đã tối giản phân số.