Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การหาผลรวมของเศษส่วนในอาร์เรย์ - JavaScript

ฟังก์ชันนี้รับอาร์เรย์ของคู่ตัวเลข [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));

ขั้นตอนการคำนวณ

  1. หาตัวหารร่วมมาก (GCD) เพื่อลดรูปเศษส่วน
  2. บวกเศษส่วน 2 ตัว: a/b + c/d = (ad + bc) / bd
  3. ลดรูปด้วย GCD
  4. ใช้ reduce() บวกทีละตัว

ผลลัพธ์

[ 1731, 140 ]

หมายเหตุ: GCD แบบ brute force ช้า สำหรับตัวเลขใหญ่ควรใช้ Euclidean algorithm