【中等】算法nodeJs:将真分数分解为埃及分数

76 阅读1分钟

描述

定义分子为 1 的分数为埃及分数,例如 2分之1​,100分之1​ 等。
现在,对于给定的一个分子小于分母的分数 ba​,请将其分解为若干个不同的埃及分数之和。随后,使用 1/b1​+1/b2​+⋯+1/bn​ 的格式输出结果,其中,b1​,b2​,…,bn​ 表示每一个埃及分数的分母。

输入描述:

以 a/b 的格式输入一个分数 ba​,其中 1≦a<b≦100。不保证分数为最简分数。

输出描述:

以 1/b1​+1/b2​+⋯+1/bn​ 的格式输出结果,其中,b1​,b2​,…,bn​ 表示每一个埃及分数的分母。

如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。

image.png

image.png

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    function egyptianFraction(numerator, denominator) {
        let result = []; // 用于存储埃及分数的结果

        // 当分子不为0时继续循环
        while (numerator !== 0) {
            // 找到最大的单位分数
            let unitDenominator = Math.ceil(denominator / numerator);
            result.push(`1/${unitDenominator}`);

            // 更新分子和分母
            numerator = numerator * unitDenominator - denominator;
            denominator = denominator * unitDenominator;

            // 简化分数
            let gcdValue = gcd(numerator, denominator);
            numerator = numerator / gcdValue;
            denominator = denominator / gcdValue;
        }

        return result.join("+");
    }

    // 计算最大公约数
    function gcd(a, b) {
        while (b !== 0) {
            let temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
    let line = (await readline()).split("/").map(Number);
    console.log(egyptianFraction(line[0], line[1]));
})();