题解 | #将真分数分解为埃及分数#
将真分数分解为埃及分数
https://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b
思路 递增的去 -1/2 -1/3这样,每次都计算减完之后的值是否可以分为 (n-1)/m + 1/m 例如 3/110 = 1/55 + 1/110
为了跟系统保持一致的像是2/4直接输出 1/3+1/6 所以在转换的时候,如果拿到的分数直接就是 1/n,那么就从 n+1开始循环去找
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 tokens = line.split('/').map(v => +v);
if(tokens[1]%tokens[0] == 0){
tokens = [1,tokens[1]/tokens[0]]
}
let arr = []
// 思路 递增的去 -1/2 -1/3这样,每次都计算减完之后的值是否可以分为 (n-1)/m + 1/m 例如 3/110 = 1/55 + 1/110
for(let i = 2;i<tokens[1]*10;i++){
if(tokens[0]/tokens[1] > 1/i){
let mu = add(tokens[1],i)
let zi = mu/tokens[1]*tokens[0] - mu/i
arr.push(i)
if(zi == 1){
arr.push(mu)
break
}
if(mu%(zi-1) == 0){
arr.push(mu/(zi-1))
arr.push(mu)
break
}
tokens[0] = zi
tokens[1] = mu
}
}
console.log(arr.map(v => '1/'+v).join("+"))
// 求最小公倍数
function add(a,b){
if(a>b){
[a,b] = [b,a]
}
for(let i = a;i>1;i--){
if(a%i == 0&& b %i == 0){
return a*b/i
}
}
return a*b
}
}
}()

