题目:

  • 链接:牛客网华为机试题
  • 分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。
  • 如:8/11 = 1/2+1/5+1/55+1/110。
  • 输入描述:

输入一个真分数,String型

  • 输出描述:

输出分解后的string

  • 示例:

样例输入:

8/11

样例输出:

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

解题思路1:
【贪心算法】
设a、b为互质正整数,a < b 分数a/b 可用以下的步骤分解成若干个单位分数之和:

  • 步骤一: 用b 除以a,得商数q 及余数r。(r=b - a*q)
  • 步骤二:把a/b 记作:a/b=1/(q+1)+(a-r)/b(q+1)
  • 步骤三:重复步骤2,直到分解完毕

按照上面的方法:
3/7=1/3+2/21=1/3+1/11+1/231
13/23=1/2+3/46=1/2+1/16+1/368

 以上其实是数学家斐波那契提出的一种求解埃及分数的贪心算法,准确的算法表述应该是这样的:设某个真分数的分子为a,分母为b;把b除以a的商部分加1后的值作为埃及分数的某一个分母c;将a乘以c再减去b,作为新的a;将b乘以c,得到新的b;如果a大于1且能整除b,则最后一个分母为b/a;算法结束;或者,如果a等于1,则,最后一个分母为b;算法结束;否则重复上面的步骤。备注:事实上,后面判断a是否大于1和a是否等于1的两个判断可以合在一起,即:判断b%a是否等于0,最后一个分母为b/a,显然是正确的。

C/C++代码:

#include <iostream>
#include <cstring>
using namespace std;
int main(){string s;while(cin>>s){string s1, s2;int a = 0, b = 0, c = 0, r = 0;int n = s.length();int x = s.find('/');s1 = s.substr(0,x);s2 = s.substr(x+1);
//cout << "x:" << x << " s1: " << s1 << " s2: " << s2 << endl;for(int i = 0; i < s1.length(); i++){a = a * 10 + s1[i]-'0';}for(int i = 0; i < s2.length(); i++){b = b * 10 + s2[i]-'0';}
//cout << a << " " << b << endl;r = b%a;if(r == 0){cout << "1/" << b/a << endl;continue;}while( r != 0){c = b/a + 1;cout << "1/" << c << "+";a = a * c - b;b = b * c;r = b%a;}cout << "1/"<< b/a << endl;}return 0;
}

但是,由于这题的答案不唯一,在牛客网运行时的通过率仅为60%,所以,牛客网上的提供的标准解并不标准。

按照上面的算法得到:
8/11 = 1/2+1/5+1/37+1/4070
由此可见答案并不唯一。

为了通过这题,下面介绍第二个解题方法:
解题思路2:
【真分数分解为埃及分数】

 * 若真分数的分子a能整除分母b,则真分数经过化简就可以得到埃及分数,* 若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为b/a+1的埃及分数。* 用这种方法将剩余部分反复分解,最后可得到结果。

C/C++的代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int main(){string s;while(cin >> s){string s1, s2;int a = 0, b = 0, c = 0, r = 0;int n = s.length();int x = s.find('/');s1 = s.substr(0,x);s2 = s.substr(x+1);for(int i = 0; i < s1.length(); i++){a = a * 10 + s1[i]-'0';}for(int i = 0; i < s2.length(); i++){b = b * 10 + s2[i]-'0';} while(a != 1){if(b % (a-1) == 0){cout << "1/" << b/(a-1) << "+";a = 1;}else{c = b/a + 1;cout << "1/" << c << "+" ;a = a*c - b;b = c * b;if(b%a == 0){b = b/a;a = 1;}}}cout << "1/" << b << endl;}return 0;
}

这个代码就可以通过……

此外:

我还看到一个用Java解题的代码不错(qaq不是我写的),附上链接:大佬的java解题代码及思路

C/C++ 【华为机试】输入一个真分数,将该分数分解为埃及分数。相关推荐

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

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将 ...

  2. Java算法:华为机试算法(下),华为算法Java版,牛客网华为算法73~108题

    接上篇:Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题   HJ73 计算日期到天数转换 计算日期到天数转换 题目描述 根据输入的日期,计算是这一年的第几天.. 测试 ...

  3. 华为机试python需要需要当时编译通过吗_华为校招软开算法岗历年机试编程题77道C++代码详解(五)...

    温馨提示:考虑到华为每年校招机试在牛客网进行,所以本文以及同系列其他八篇文章的所有代码均仅保证在牛客网华为机试页面100%accepted.其他编译器使用本代码可能会出现不通过的情况,请知晓. 41. ...

  4. 华为机试训练做题总结(四)

    69. 字符串通配符 题目描述 : 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法. 要求: 实现如下2个通配符: *:匹配0 ...

  5. 华为OJ平台——将真分数分解为埃及分数

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

  6. python埃及分数_C语言将真分数分解为埃及分数代码解析

    问题描述 现输入一个真分数,请将该分数分解为埃及分数. 问题分析 真分数:分子比分母小的分数,叫做真分数.真分数的分数值小于1.如1/2,3/5,8/9等. 分子是1的分数,叫单位分数.古代埃及人在进 ...

  7. 牛客网--华为机试在线训练1:字符串最后一个单词的长度

    牛客网–华为机试在线训练1:字符串最后一个单词的长度 题目地址: https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da? ...

  8. 【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 金九银十,金三银四.当前正处于校招.社招的火热期,之前就想为正在筹备就业的同学们准备刷题宝 ...

  9. 牛客在线编程-华为机试-中等

    牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...

  10. 华为机试108题(C 语言解答)

    Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...

最新文章

  1. 学java为什么要报java培训班?
  2. 项目: 用Easyx绘制围棋和象棋的棋盘
  3. 净利润跌幅超六成,坚持要做“鸭中星巴克”的周黑鸭怎么了?
  4. c++中的new与delete运算符
  5. Windows 7系统如何重装或安装IE8?
  6. 目前市场上用于个人计算机的硬盘尺寸是,第5章-硬盘(计算机组装与维护).docx
  7. centos7更换源
  8. LeetCode 1004. 最大连续1的个数 III(双指针+滑动窗口)
  9. ios 添加导航栏视图_iOS进度栏(进度视图)
  10. Google浏览器调试页面时设置分辨率
  11. 微信公众号运营必备神器汇总
  12. graphviz linux教程,linux下做图工具——graphviz安装配置
  13. 看完《我的前半生》的些许感悟
  14. DM368开发 -- 视频监控系统相关技术研究(转毕设)
  15. [经验教程]中国民生银行信用卡积分怎么兑换免费腾讯视频VIP会员?
  16. Elsa-审批流实现
  17. 分享一下微带天线的心得体会
  18. PCL 点云配准衡量指标
  19. 2026年中国大数据总体市场规模将超359亿美元
  20. 软件工程实训有必要吗_软件工程实训心得体会

热门文章

  1. java 时区 夏令时_关于时区:如何显示Java开始夏令时后的时间差异?
  2. openCV-二值化,黑白图片
  3. 【教程】win10 固态硬盘卡机卡死卡顿的真正原因!
  4. 卡在硬盘启动计算机,插硬盘启动卡死了,怎么办?电脑维修方法
  5. webgl中顶点着色器的varying变量,使用方法。
  6. 程序员鄙视链, 所有工程师都鄙视php工程师, 为什么
  7. 全年爆文率14%+,这个小红书品牌的内容营销密码是什么?
  8. 图像分类经典卷积神经网络—SENet论文翻译(纯中文版)—Squeeze-and-Excitation Networks(挤压和激励网络)
  9. Linux常见英文翻译
  10. 神威太湖之光之超级计算机,中国研发的“神威·太湖之光”,超级计算机能给我们带来什么?...