题解 | #将真分数分解为埃及分数#
将真分数分解为埃及分数
https://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b
实际用时在260ms左右,解法相对简单
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
while ((line = await readline())) {
let [z, m] = line.split("/");
let arr = [];
// 解法四:优化后的解法三 // 前面三个不好的解法就不放出来了
function add3(i) {
// 首先判断 m/(z-1) 如果可以除通,则直接解决,如 3/24 + 1/24
if (m % (z - 1) == 0) {
arr.push(m / (z - 1), m);
return 1;
}
// 最后如果上述情况都不行的话,就
// 先判断是 1/i 是否小于当前的 z/m
// 如果小于,则求最小公倍数,并减去 1/i 再继续计算
if(m<i*z){
let bei = beishu(i, m);
let newZ = (bei / m) * z - bei / i; // 新的分子
if (newZ == 1) {
arr.push(i, bei);
return 1;
}
if (newZ > 1) {
arr.push(i);
if (bei % newZ == 0) {
arr.push(bei / newZ);
return 1;
}
if (bei % (newZ - 1) == 0) {
arr.push(bei / (newZ - 1), bei);
return 1;
}
m = bei;
z = newZ;
// return add2(i + 1, bei, newZ);
}
}
return 2;
}
for (let i = 2; i < 999999999; i++) {
if (add3(i) == 1) {
i = 999999999;
}
}
console.log(
arr
.map((v) => {
return "1/" + v;
})
.join("+")
);
// 求最小公倍数
function beishu(a, b) {
let [max, min] = [a > b ? a : b, a < b ? a : b];
if (max % min == 0) return max; // 是其中一个倍数的时候,则返回那个大的值,就是最小公倍数,否则往下找
let arr = []; // 公约数
for (let i = 2; i < max * min; i++) {
if (max % i == 0 && min % i == 0) {
arr.push(i);
max = max / i;
min = min / i;
}
}
arr.push(max * min);
return arr.reduce((pre, v) => (pre *= v), 1);
}
// console.log(beishu(+z,+m))
}
})();

