1 . 问题

埃及分数是指分子是1的分数,也叫单位分数。古代埃及人在进行分数运算时。只使用分子是1的分数。因此这种分数也叫做埃及分数,或者叫单分子分数。 [Baidu百科]

给定一个分数,如7/8,我们可以把它表示为1/2 + 1/3 +1/24,埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式。

2. 贪心算法

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解 [Baidu百科]

由于贪心算法的每次都是贪婪选择的特性,我们可以用7/8来举例,小一点的埃及分数是怎么算出来的,你完全可以举例,前提是埃及分数必须要 1/x 的形式。

比7/8小一点的埃及分数 是多少,应该是 1/2 ( 4/8),去除1/2后剩3/8。

比3/8小一点的埃及分数是 1/3(3/9),去除之后剩 1/ 24 ,得到最终答案。

那么该如何用代码实现呢?

3.如何实现

下面最核心的问题应该是:

如何找到真分数包含的最大埃及分数?

设真分数 a/b ,b 除以 a得整数部分为c,余数部分d。

那么按照数学上的运算,可以得到如下等式:

b = a * c + d [1]

凭空冒出这么个东西还真不习惯。

拿7/8举例子。a = 7,b = 8

那么 按照[1]式 8 = 7 * 1 + 1

我们对[1]式进行运算,两边同除a,得到[2]式

b / a = (a * c + d) / a [2]

对[2]式右边进行化简得到[3]

b/a = c + d/a [3]

由前提条件:d是a得余数,那么a肯定要比d大。(小学数学问题,不啰嗦了)

那么可以得到下面的[4]

b/a = c + d/a < c + 1 [4]

我们对两边取倒数,即可得到如下的[5] (注意取到数的符号变化)

a/b > 1 / (c + 1)[5]

已经可以看出 比 a / b 小的埃及分数了,且 1 / (c + 1)一定是 a / b所包含的最大埃及分数。

已经可以证明1/(c +1) 是 a/b的埃及分数了,但为什么说1/(c + 1)是a/b 所包含的最大埃及分数?

其实可以由[4] 得出 a/b = 1 / (c + d/a) ,而d/a 一定小于1,我们要找最大的埃及分数,就要取一个最小的整数分母,而最小(最接近)的整数分母就是 c + 1了,所以1/(c + 1)一定是其包含的最大的埃及分数了

这个思想有点逆乎常人,是一种类似反推的想法,但是知道能算出来就OK了。

下面我们设 e = c + 1(注意,1/e是最大埃及分数)

按照上面我们所说,一个真分数减去它的最大埃及分数。

运算出来就是:

**a/b - 1 /e ** [6]

我们把它通分。

通分后的结果

我们就可以知道 一个真分数减去一个最大埃及分数之后

原来的a 变成了,a * e - b,原来的b变成了 b * e

那么下面来看看核心代码

//要求是如果分子大于1就可以拆分

do {

e= b/a + 1;

System.out.println("1/"+e);

a = a * e- b;

b = b * e;

int maxDiv = maxComDiv(a,b);

if(maxDiv > 1){

a /= maxDiv;

b /= maxDiv;

}

}while (a > 1);

最外层的do-while循环好理解,如果a(分子)不是1,那么就不是埃及分数,就要一直拆分。

拆分的过程我刚才也已经说过了,分为下面3步。

找到当前真分数的最大埃及分数

刚才我们说过,最大的埃及分数是 1/(c + 1)又因为e = c + 1,所以

1/e = 1 /(c + 1), 而我们目的是求当前真分数的最大埃及分数,所以也就是求 1/e ,进而推要求e,e = b/a + 1 ,有同学可能会问,d哪里去了。根据[4]式,b/a = e - 1 + d/a == => e = b/a + d/a -1 ,完全不一样啊?

别忘了我们是在写程序,b/a只会求得正数部分c,而不会求得余数部分d。

按照java得原则,

[1]式 就是 b = a * c

那自然就有 b / a = e - 1

即 e = b / a + 1

那要按照某些不损失精度的语言来说,可就要按照上面走啦。

减去最大埃及分数后通分

上面的通分图片中我们已经看到了, a / b 减去最大埃及分数后通分的样子,所以直接写代码:

a = a * e- b;

b = b * e;

约分

通完分之后又要约分,这是什么操作?

因为我们不约分就又整出更大的分数来了,这样运算更麻烦,可能还求不出来

经测试,不约分会产生死循环,根本求不出目标答案

约分是怎么个操作,首先找到最大公约数r,然后a/r ,b/r即可完成约分,那么最大公约数必然想到用辗转相除法来求,最后面将补充辗转相除的算法。

下面是全部代码。

import java.io.BufferedReader;

import java.io.InputStreamReader;

//埃及分数

public class EgyptFraction {

public static void main(String[] args) throws Exception{

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

System.out.println("输入分子");

int a = Integer.parseInt(bufferedReader.readLine());

System.out.println("输入分母");

int b = Integer.parseInt(bufferedReader.readLine()); //输入ab

int e;

//要求是如果分子大于1就可以拆分

do {

e = b/a + 1;

System.out.println("1/"+e);

a = a * e - b;

b = b * e;

int maxDiv = maxComDiv(a,b);

if(maxDiv > 1){

a /= maxDiv;

b /= maxDiv;

}

}while (a > 1);

System.out.println("1/"+b);

}

private static int maxComDiv(int a, int b) {

int temp = 0;

while(b != 0){

temp = a % b;

a = b;

b = temp;

}

return a;

}

}

4. 补充- 辗转相除

埃及分数C语言算法,2019-02-27 埃及分数 (贪心算法简单示例)相关推荐

  1. Technology Daily - 2019/02/27

    2019/02/27 10 Instagram Tools to Grow Your Client's Audience https://medium.com/m/global-identity?re ...

  2. 数据结构与算法_02_局部最优的贪心算法

    数据结构与算法,系列文章传送地址,请点击本链接. 目录 一.贪心思想 二.解贪心算法的步骤 三.贪心算法存在的问题 四.贪心算法的案例 一.贪心思想 ​ 1.贪心算法(又称贪婪算法)是指,在对问题求解 ...

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

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

  4. c语言背包问题贪心算法,C/C++语言算法篇(一):贪心算法

    贪心算法 正所谓人人都有贪心,C语言算法上的贪心可不是实际意义上的贪心,C语言结构上的贪 心可以说满足两个条件:贪心选择性质和最优子结构性质.满足这两个条件的话就可以尝试用贪心算法解决问题. 贪心选择 ...

  5. 贪心算法两船装载问题Java_贪心算法-最优装载问题

    贪心选择算法为算法分析中一种常用算法,通过一系列的选择来得到一个问题的解.它所作的每一个选择都是当前状态下某种意义的最好选择,即贪心选择.希望通过每次所作的贪心选择导致最终结果是问题的一个最优解.这种 ...

  6. 《算法导论》第16章 贪心算法 个人笔记

    第16章 贪心算法 16.1 活动选择问题 问题:假设有一个n个活动的集合S=a1,a2,...,anS={a_1,a_2,...,a_n},这些活动使用同一个资源,而这个资源在某个时刻只能供一个活动 ...

  7. 算法设计与分析 实验三 贪心算法

    一. 实验目的和要求 1.掌握贪心算法的基本思想. 2.学习利用贪心算法设计和实现算法的方法. 3.了解利用替换法证明贪心策略是否能获得全局最优解的过程. 4.熟练掌握贪心算法在两个典型图搜索中的应用 ...

  8. 【算法图解】 之 [贪婪算法(贪心算法)] 详解

    入门算法学习,看的第一本是深入浅出的<算法图解>一书,本博客是对<算法图解>一书的学习笔记,将书中的分享的算法示例用Python3语言实现. 如果你也想要阅读这本书,百度云盘链 ...

  9. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  10. 【Java数据结构与算法】第十九章 贪心算法、Prim算法和Kruskal算法

    第十九章 贪心算法.Prim算法和Kruskal算法 文章目录 第十九章 贪心算法.Prim算法和Kruskal算法 一.贪心算法 1.介绍 2.支付问题 二.Prim算法 1.最小生成树 2.介绍 ...

最新文章

  1. 时间序列的建模新思路:清华、李飞飞团队等提出强记忆力E3D-LSTM网络
  2. Python系统命令操作
  3. MySQL 第二篇:增删改查
  4. base target=_self是什么意思
  5. Bad Request: amp;quot;requirement failed: Local path /root/.livy-sessions/
  6. tabBar颜色改动
  7. MVC学习九:MVC 特性本质
  8. python3 md5_Python3.2 --md5
  9. Java基础学习总结(159)——JDK15 正式发布了!新增14个新特性
  10. python cut函数_一天学会Python Web框架(七)工具函数
  11. c语言【const】用法
  12. scrapy实例三 【豆瓣电影Top250】
  13. 微信公号“架构师之路”学习笔记(六)-互联网一致性架构设计(session一致性,主从一致性,双主一致性,缓存一致性,冗余一致性,消息时序一致性,分布式事务一致性,数据扣减一致性等)
  14. Julia: 自制的Julia代码排版工具CodeBeautify
  15. OpenCV环境搭建(Windows+Visual studio)及Hello World
  16. 压力测试 - Apache JMeter使用教程
  17. vue + vant 使用阿里图标库
  18. (20191227已解决)从Linux服务器下载超过4G的文件并批量操作同类型文件
  19. 想学CNC编程的一定要看过来~
  20. 程序员需要了解的常见的英文缩写的含义

热门文章

  1. Python课设实验 之 车票订购系统.(sqlite数据库 储存.)
  2. 【电力电子技术】THE CUK 电路
  3. 人工智能第一篇--语音识别和语音合成
  4. android语音信箱功能,语音信箱的功能有哪些?
  5. win10电脑显示网络未连接到服务器,教你win10电脑网络连接显示未连接不可用的方法...
  6. 论文笔记:nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation
  7. C语言试题(答案带解析)
  8. Vue 混入(mixin)详细介绍(可复用性、全局混入)
  9. 捷报!新钛云服斩获WRE「最佳云服务解决方案创新奖」
  10. RTL8192CUS驱动程序编译