题解 | #将真分数分解为埃及分数#
将真分数分解为埃及分数
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 } } }()