都在注释中了
import java.util.ArrayList;
import java.util.List;import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String[] split = s.split("/");
String s1 = split[0];
List<String> result = new ArrayList<>();
Long molecular = Long.valueOf(s1);
Long denominator = Long.valueOf(split[1]);
// 初始化
List<Long> substruction = substruction(molecular, denominator, 0L, denominator);
// 从1/2开始
Long i = 2L;
while (substruction.get(0)!=0){
// i>0是必然true molecular大于1说明还能继续往下减,往下分解
while (i>0&&molecular>1){
//每次减去1/i
List<Long> substruction1 = substruction(molecular, denominator, 1L, i);
// 如果能减 说明可以分解 存结果 更新值 i++继续往后 并结束此次内循环
if (substruction1.get(0)>=0){
result.add(String.valueOf(1)+"/"+ String.valueOf(i));
substruction.set(0,substruction1.get(0));
substruction.set(1,substruction1.get(1));
molecular = substruction1.get(0);
denominator = substruction1.get(1);
i++;
break;
}
i++;
}
// 如果上一次相减后 分子为1 结果是埃及分数 符合要求 添加到结果集中 循环结束
if (molecular == 1){
result.add(String.valueOf(1)+"/"+ String.valueOf(denominator));
break;
}
}
// 结果输出
for (int j = 0; j < result.size(); j++) {
if (j!=result.size()-1) System.out.print(result.get(j)+"+");
else System.out.print(result.get(j));
}
}
// 写一个分数相减的方法 返回值是分子和分母
public static List<Long> substruction(Long mole1,Long deno1,Long mole2,Long deno2){
List<Long> list = new ArrayList<>();
// 如果分母一样 则分子相减
if (deno1 == deno2){
list.add(mole1-mole2);
list.add(deno1);
} else {
// 分母不一样 就通分后进行计算
Long newmodel = mole1*deno2-mole2*deno1;
Long newdeno = deno1*deno2;
list.add(newmodel);
list.add(newdeno);
}
return list;
}
}