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

将真分数分解为埃及分数

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

全部评论

相关推荐

白火同学:能。我当初应届沟通了1200,收简历50,面试10左右吧,加油投吧
投了多少份简历才上岸
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-26 14:50
人力小鱼姐:有后面墨迹那两句的时间问题早回答完了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务