真分数的问题首先想到的肯定是 1/2+1/3+...+1/(∞-1)+1/∞==1, 所以比1/2大就减掉,小就往后走;剩下的比1/3大,再减,小继续往后;以此类推;(递归部分) 然后发现这样虽然可以搞定,但是太慢(根据提交结果看,时间消耗属于最后的3%那一部分,资源消耗也在最后的20%), 并且发现和给定的结果不一样 ps:8/11 我们给出的结果是 1/2+1/5+1/37+1/4070; 明显我们的结果太消耗算力,分析结果的 3/110 = 1/55 + 1/110; 可以推出这种方式z/m解为 1/m + (z-1)/m; 这样就不用大量计算了,只需要 m%(z-1) == 0 即可 当然这里可以考虑系统给的一些不用算的,m%z==0 的直接转换 1/(m/z) 在
var arr = [];
for(var i = 0;i<100;i++){
var str = readline();
if(str){
arr[i] = str;
}else{
i = 100;
}
}
for(var i = 0;i<arr.length;i++){
var arr1 = [];
// console.log(arr[i]);
arr1 = arr[i].split("\/");
print(getOne(arr1));
}
function getOne(arr){
var z = 1*arr[0];//分子
var m = 1*arr[1];//分母 m>z
var arrM = [];//埃及分数分母的集合数组
getAJ(z,m,arrM);
var str = "1/";
var result = "";
for(var i = 0;i<arrM.length;i++){
if(arrM.length == i + 1){
result = result + str + arrM[i];
}else{
result = result + str + arrM[i] + "+"
}
}
return result;
}
function getAJ(z,m,arrM,x){//z 分子 m 分母 arrM 埃及分母的集合的数组 分母起点,初始默认为2
if(z!=0 && m%z == 0){
arrM.push(m/z);
return arrM;
}
x = x || 2;//初始分母从2开始
if(z == 1){
arrM.push(m);
return arrM;
}else if(z == 0){
return arrM;
}else if(m%(z-1)==0){
arrM.push(m/(z-1));
arrM.push(m);
return arrM;
}
/**递归部分*/
for(var i = x;i<999999999;i++){
if(z*i>=m){
arrM.push(i);
getAJ(z*i-m,m*i,arrM,i+1);
i = 999999999;
}
}
}