埃及分数C语言算法,2019-02-27 埃及分数 (贪心算法简单示例)
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 埃及分数 (贪心算法简单示例)相关推荐
- Technology Daily - 2019/02/27
2019/02/27 10 Instagram Tools to Grow Your Client's Audience https://medium.com/m/global-identity?re ...
- 数据结构与算法_02_局部最优的贪心算法
数据结构与算法,系列文章传送地址,请点击本链接. 目录 一.贪心思想 二.解贪心算法的步骤 三.贪心算法存在的问题 四.贪心算法的案例 一.贪心思想 1.贪心算法(又称贪婪算法)是指,在对问题求解 ...
- python埃及分数_C语言将真分数分解为埃及分数代码解析
问题描述 现输入一个真分数,请将该分数分解为埃及分数. 问题分析 真分数:分子比分母小的分数,叫做真分数.真分数的分数值小于1.如1/2,3/5,8/9等. 分子是1的分数,叫单位分数.古代埃及人在进 ...
- c语言背包问题贪心算法,C/C++语言算法篇(一):贪心算法
贪心算法 正所谓人人都有贪心,C语言算法上的贪心可不是实际意义上的贪心,C语言结构上的贪 心可以说满足两个条件:贪心选择性质和最优子结构性质.满足这两个条件的话就可以尝试用贪心算法解决问题. 贪心选择 ...
- 贪心算法两船装载问题Java_贪心算法-最优装载问题
贪心选择算法为算法分析中一种常用算法,通过一系列的选择来得到一个问题的解.它所作的每一个选择都是当前状态下某种意义的最好选择,即贪心选择.希望通过每次所作的贪心选择导致最终结果是问题的一个最优解.这种 ...
- 《算法导论》第16章 贪心算法 个人笔记
第16章 贪心算法 16.1 活动选择问题 问题:假设有一个n个活动的集合S=a1,a2,...,anS={a_1,a_2,...,a_n},这些活动使用同一个资源,而这个资源在某个时刻只能供一个活动 ...
- 算法设计与分析 实验三 贪心算法
一. 实验目的和要求 1.掌握贪心算法的基本思想. 2.学习利用贪心算法设计和实现算法的方法. 3.了解利用替换法证明贪心策略是否能获得全局最优解的过程. 4.熟练掌握贪心算法在两个典型图搜索中的应用 ...
- 【算法图解】 之 [贪婪算法(贪心算法)] 详解
入门算法学习,看的第一本是深入浅出的<算法图解>一书,本博客是对<算法图解>一书的学习笔记,将书中的分享的算法示例用Python3语言实现. 如果你也想要阅读这本书,百度云盘链 ...
- 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...
- 【Java数据结构与算法】第十九章 贪心算法、Prim算法和Kruskal算法
第十九章 贪心算法.Prim算法和Kruskal算法 文章目录 第十九章 贪心算法.Prim算法和Kruskal算法 一.贪心算法 1.介绍 2.支付问题 二.Prim算法 1.最小生成树 2.介绍 ...
最新文章
- 时间序列的建模新思路:清华、李飞飞团队等提出强记忆力E3D-LSTM网络
- Python系统命令操作
- MySQL 第二篇:增删改查
- base target=_self是什么意思
- Bad Request: amp;quot;requirement failed: Local path /root/.livy-sessions/
- tabBar颜色改动
- MVC学习九:MVC 特性本质
- python3 md5_Python3.2 --md5
- Java基础学习总结(159)——JDK15 正式发布了!新增14个新特性
- python cut函数_一天学会Python Web框架(七)工具函数
- c语言【const】用法
- scrapy实例三 【豆瓣电影Top250】
- 微信公号“架构师之路”学习笔记(六)-互联网一致性架构设计(session一致性,主从一致性,双主一致性,缓存一致性,冗余一致性,消息时序一致性,分布式事务一致性,数据扣减一致性等)
- Julia: 自制的Julia代码排版工具CodeBeautify
- OpenCV环境搭建(Windows+Visual studio)及Hello World
- 压力测试 - Apache JMeter使用教程
- vue + vant 使用阿里图标库
- (20191227已解决)从Linux服务器下载超过4G的文件并批量操作同类型文件
- 想学CNC编程的一定要看过来~
- 程序员需要了解的常见的英文缩写的含义
热门文章
- Python课设实验 之 车票订购系统.(sqlite数据库 储存.)
- 【电力电子技术】THE CUK 电路
- 人工智能第一篇--语音识别和语音合成
- android语音信箱功能,语音信箱的功能有哪些?
- win10电脑显示网络未连接到服务器,教你win10电脑网络连接显示未连接不可用的方法...
- 论文笔记:nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation
- C语言试题(答案带解析)
- Vue 混入(mixin)详细介绍(可复用性、全局混入)
- 捷报!新钛云服斩获WRE「最佳云服务解决方案创新奖」
- RTL8192CUS驱动程序编译