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

将真分数分解为埃及分数

http://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b

let line;

const getCommonConvention=(x,y)=>{
//     求最小公约数 欧里几德算法,辗转相除法
    if(y == 0){
        return x
    }
    let z = x % y;
    return getCommonConvention(y,z)
}
const getCommonMultiple=(x,y)=>{
//     求最小公倍数
    return (x*y) / getCommonConvention(x,y)
}
const getCalc=(x,y)=>{
//     存放结果集合
    let result = [];
    let increase = 0;
    while(increase!=1){
// 分母处以分子判断分子是分母的几分之几。比如8/11。 11/8 大于1 小于2 所以最多占1/2 
        let a = Math.floor(y / x);
//      获取 2和11的最小倍数22 转变成相同分母
        let commonMultiple = getCommonMultiple(y, a + 1);
//          将1/2放入第一个集合
        result.push('1/'+String(a+1))
        
//     同等放大然后计算剩下的分子
         increase = (commonMultiple / y * x) -  (commonMultiple / (a + 1))
//       比如 8 / 11 a=1 a+1 = 2. 第一个是1/2 所以最小公倍数是22, (22/11 * 8) - (22/1+1) 就是余数 5。
//         简单来说就是。8/11 - 1/2 转变成 16/22 - 11/22 剩余5 即是5/22
//         将问题转变成1/2 + 5/22的埃及分数 我们只需要求5/22的埃及分数
//     判断剩余的值 和 最小公倍数是不是可以整除 如果整除则代表分子是分母的 1/xx. 
//         如果不能整除则继续寻找 5/22的埃及分数
         if(y % x == 0){
             y = commonMultiple / increase
             x = 1
         }else{
              x = increase
              y = commonMultiple
         }
        
         if(increase==1){
             result.push('1/'+String(commonMultiple))
         }
    };
    return result
}
while(line = readline()){
    let str = line;
    let numArr =  str.split('/')
    let x = parseInt(numArr[0])
    let y = parseInt(numArr[1])
    let result = getCalc(x,y)
    console.log(result.join('+'));
    
}
全部评论

相关推荐

蔡徐kun:还行,早挂晚挂都是挂。早点挂进池子等别人捞你
点赞 评论 收藏
分享
给🐭🐭个面试机会吧:我boss直聘天天有家教跟我打招呼😓
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务