题解 | #将真分数分解为埃及分数#

将真分数分解为埃及分数

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
        }
    }
}()

全部评论

相关推荐

昨天 21:00
门头沟学院 Java
多拆解背记一下当前的高频场景面试题,结合自己的项目经历去作答,面试通过率原来真的不会低!
牛客965593684号:小公司不就是这样的吗,面试要么是点击就送,要么就是往死里拷打,没有一个统一的标准。这个不能代表所有公司
点赞 评论 收藏
分享
Rena1ssance_:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
06-19 16:21
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务