题解 | #将真分数分解为埃及分数#
将真分数分解为埃及分数
https://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b
贪心
这题一开始,我是在找组成这个真分数的埃及分数的规律,其实完全没必要,因为不管什么样的真分数,它都是可以用埃及分数组成的。并且结果可能有多个。这两个关键信息一定要get到
1、任何的真分数,都可以用多个埃及分数进行分解 2、结果可能有多个
所以可以把大问题化成小问题,大的真分数化成小的真分数。
例题目中的 8/11,我先用一个埃及分数去把它化小点,再用一个埃及分数把它化小点,到最后,一定可以化成一个埃及分数。这些都基于上面中的两点推算出来的。因为如果不行,那么肯定存在一个真分数不能用埃及分数进行分解,也就否定了第一条,那么题目中肯定会说如果分解不了给XXX结果。
所以解法就是: 步骤一:8/11, 它比1/2大, 1/3小。 所以用1/2去分解 (减去1/2),得到 5/22 步骤二:5/22, 它比1/5大, 1/4小。 所以用1/5去分解 (减去1/5),得到 3/110 步骤三:3/110,它比1/37大,1/38小。所以用1/37去分解(减去1/37),得到 1/4070 结果是:8/11 = 1/2 + 1/5 + 1/37 + 1/4070
因为用的是贪心,每次选择一个最大的埃及分数去分解,其实在步骤3也可以用 1/55去分解。答案有多个,题目要求任意一个即可。
所以,整个题目的难点就在于知道一个比当前真分数小的埃及分数,然后用这个埃及分数去减,一步一步循环上述步骤就可以了。
Scanner in = new Scanner(System.in); while (in.hasNextLine()){ String[] split = in.nextLine().split("/"); long a = Long.parseLong(split[0]); long b = Long.parseLong(split[1]); StringBuilder res = new StringBuilder(); //存结果的 while (true){ //先找到一个能减去的最大埃及分数的分母 ,结果是 1/ c long c = b / a + 1; // a/b减去 1/c 之后的分子分母如下 a = a * c - b; b = b * c; res.append(1).append('/').append(c).append('+'); if (a == 1 || b % a == 0){ res.append(1).append('/').append(b/a); break; } } System.out.println(res.toString());