华为机试HJ82:将真分数分解为埃及分数

简介: 华为机试HJ82:将真分数分解为埃及分数

题目描述:

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。


注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!


如有多个解,请输出任意一个。


请注意本题含有多组样例输入!

输入描述:

输入一个真分数,String型

输出描述:

输出分解后的string

示例:

输入:

8/11

2/4

输出:

1/2+1/5+1/55+1/110

1/3+1/6


说明:

第二个样例直接输出1/2也是可以的

解题思路:

本题有两个方法:1)取巧;2)贪心算法。


1)直接输出n个1/X即可,比如8/11就输出1/11+1/11+。。。+1/11,emm取巧。


2)贪心算法即在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解 。令真分数8/11进行拆分,先找到比其小的最大埃及分数,也就是1/2,那么8/11-1/2等于5/22,则找其最大埃及分数,即1/5,以此类推直到找完所有的埃及分数。其算法实现如下:

  1. 假设真分数为a/b,那么b除以a可以得到c,余数为d。即
  2. 两侧同除a,可以得到;
  3. 因为d是a的余数,所以d<a,那么;
  4. 两边取倒数,即,1/(c+1)就是我们要找的最大埃及分数;
  5. 令e=c+1,则有
  6. 即表示减去一个最大埃及分数后,新的a=a*e-b,新的b等于b*e;
  7. 当a等于1时说明分解到头了,此时的b就是最后一个埃及分数的分母。

测试代码:

1)取巧方法。

#include<iostream>
#include<string>
using namespace std;
int main() {
    string s;
    while (cin >> s) 
    {
        string ans;
        int n;
        for (int i = 0; i < s.size(); i++) 
        {
            if (s[i] == '/') 
            {
                n = stoi(s.substr(0, i));
                s = "1/" + s.substr(i + 1) + "+";
                break;
            }
        }
        while (n--) {
            ans += s;
        }
        cout << ans.substr(0,ans.size()-1) << endl;
    }
    return 0;
}

2)贪心算法。

#include<iostream>
#include<string>
using namespace std;
int main() {
    string s;
    while (cin >> s) {
        string ans;
        int a,b;
        for (int i = 0; i < s.size(); i++) 
        {
            if (s[i] == '/') {
                a = stoi(s.substr(0, i));
                b = stoi(s.substr(i + 1));
                break;
            }
        }
        while(1)
        {
            int e=b/a+1;
            ans+="1/";
            ans+=to_string(e);
            a=a*e-b;
            b=b*e;
            ans+="+";
            if(a==1)
            {
                ans+="1/";
                ans+=to_string(b);
                break;
            }
            else if(a>1&&b%a==0)
            {
                ans+="1/";
                ans+=to_string(b/a);
                break;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}


相关文章
|
存储 JSON 监控
APM监控 · 入门篇 · Android端测监控平台建设(1)
APM 全称 Application Performance Management & Monitoring (应用性能管理/监控) 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿、响应速度慢、发热严重、流量电量消耗大等问题的时候,很可能就会卸载掉我们的 App。这也是我们在目前工作中面临的巨大挑战之一,尤其是低端机型。
3999 0
APM监控 · 入门篇 · Android端测监控平台建设(1)
|
自然语言处理 程序员
大模型问题之大模型与之前的NLP技术有什么显著差别
大模型问题之大模型与之前的NLP技术有什么显著差别
235 2
|
存储 缓存 Linux
如何在 CentOS 8 上安装 OpenCV?
OpenCV 的用途非常广泛,包括医学图像分析,拼接街景图像,监视视频,检测和识别面部,跟踪运动对象,提取 3D 模型等等。
511 0
|
SQL 数据处理
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
SQL 能力问题之合并两个存在交叉的日期区间,如何解决
|
Java API 开发者
|
算法 Java
Java将16进制的字符串转换为10进制数的方法
【6月更文挑战第27天】Java将16进制的字符串转换为10进制数的方法
2664 0
|
机器学习/深度学习 JSON 算法
TensorFlow Serving使用指南
TensorFlow Serving使用指南
801 0
|
算法 测试技术 UED
Python实现计算器的设计与实现
Python实现计算器的设计与实现
587 0
|
机器学习/深度学习 存储 自然语言处理
大模型面经答案—强化学习:理论解释与讲解
微信上偷来的文章(哈哈(ಡωಡ)hiahiahiahiahiahia),我可是选的转载的,收藏起来自己偷偷复习大模型,希望能赶上下一波风口。
|
Python
python十六进制怎么转换成十进制
python十六进制怎么转换成十进制
502 0