描述
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。
输入描述:
输入一个真分数,String型
输出描述:
输出分解后的string
示例1
输入:
8/11
2/4
输出:
1/2+1/5+1/55+1/110
1/3+1/6
说明:
第二个样例直接输出1/2也是可以的
预处理:
处理输入的字符串得到分子a和分母b,由于是真分数 所以a < b
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] ops = in.nextLine().split("/");
long a = Long.parseLong(ops[0]);
long b = Long.parseLong(ops[1]);
}
}
解法1:
投机取巧型
=
System.out.println(String.join("+", Collections.nCopies((int) a, "1/" + b)));
解法2:
斐波那契贪心算法 找最大的分式
因为 a < b 所以有
即
则
为了将a约掉 凑成形式的分式
先对分子分母同时乘以q+1 得到
在将分子 + r - r 分式值不变
展开分子项、去除不必要的括号
因为
所以
我们需要的是这种形式
令
则 成为新的
不断迭代这个过程 迭代的过程中
分子的变化是 分母的变化是
当 迭代结束。最后一个分式为
或者当时,迭代结束。最后一个分式为
StringBuilder sb = new StringBuilder();
while (true) {
long q = b / a, r = b % a;
if (a == 1) {
return sb.append("1/").append(b).toString();
} else if (r == 0){
return sb.append("1/").append(q).toString();
} else {
sb.append("1/").append(q + 1).append("+").toString();
}
a -= r;
b *= q + 1;
}
System.out.println(sb);