题解 | #将真分数分解为埃及分数#

将真分数分解为埃及分数

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());

全部评论

相关推荐

牛客482196251号:你是我见过最大的牛客女孩,这个评论是我给你的礼物
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务