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