贪心算法基础(二)

今天我们还是讲贪心算法。题目是:将一个真分数表示成若干个埃及分数的和。啥是埃及分数?例如:1/2这就是埃及分数,也就是分子为1的分数。例如:7/8=1/2+1/3+1/24。

那么怎么实现这个呢?

因为是加法运算,所以我们通过一项项的“拆项”来实现。

1.找出最大的埃及分数,使得f>1/n。

2.输出1/n.

3.f=f-1/n.

4.如果f是埃及分数则完成,否则继续第一步.

但是先要注意,高级语言不支持分数的运算,所以表示分数我们只能分别输入分子和分母。设分子是A,分母是B。则B/A的上为C,余数为K,B=A*C+K.。则B/A=C+K/A,而K<A,则K/A<1,所以B/A<c+1,令C+1=D,则A/B>1/D,因此我们求出了上面说的n。

其次,A/B-1/D=(AD-B)/BD,所以要分别计算A,D,B的值,然后对他们进行运算。

最后,当A=1,我们就完成了。还可以A!=1,但是A和B是倍数关系,这样也可以。

代码:就不贴主函数了。

	int fz,fm,n;
	scanf("%d %d",&fz,&fm);//输入分子和分母
	printf("%d/%d=",fz,fm);
	if (fz>fm)
	{
		printf("ERROR");
	}
	else if ((fm%fz==0)||fz==1)
	{
		printf("%d/%d",fz,fm);
	}
	else
	{
		while(fz!=1)
		{
			n=fm/fz+1;
			printf("1/%d+",n);
			fz=fz*n-fm;
			fm=fm*n;
			if (fz==1)
			{
				printf("1/%d",fm);
			}
			if ((fz>1)&&(fm%fz==0))
			{
				printf("1/%d",fm/fz);
				fz=1;//用来结束循环
			}
		}
	}
时间: 2024-12-28 13:49:20

贪心算法基础(二)的相关文章

算法基础二 递推法

/*递推法*/ /*斐波那契数列 1 1 2 3 5 8 13..... f(n)?*/ /*递推法的特点是由前向后推算,因此注意起始条件,并在推算过程中保存结果供下一步推算使用~*/ #include<iostream> using namespace std; int f1(int n) { if (n < 3)return 1; else { int t1 = 1; int t2 = 1; for (int i = 2; i < n; i++) { int temp = t1

贪婪法——————贪心算法

华信清明节放假,所以不用去上课,而我又不想出去,所以就用了一点时间去研究算法. 我今天开始看王晓华写的<算法的乐趣>,把它当做教材. 看到贪心算法,因为大一的时候C语言没学好,所以作者写的C实现代码不是看得很懂,但是基本思想还是能够掌握的. 接下来我总结一下我今天学到的贪心算法: 贪心算法是寻找最优解问题的常用方法. 基本思想是分三个步骤: 1.建立对问题精确描述的数学模型,包货定义最优解的模型. 2.将问题分成一系列的子问题,同时定义子问题的最优解结构. 3.应用贪心算法原则可以确定每个子问

零基础学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅.贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关.解题的一般步骤是:1.建立数学模型来描述问题:2.把求解的问题分成若干个子问题:3.对每一子问题求解,得到子问题的局部最优解:4.把子问题的局部最优

JAVA算法基础-贪心算法

前言 学无止境.算法博大精深啊,一个贪心算法里面就隐含了这么多不同的场景实现,每个场景下的算法就有多种不同的实现,个人写法不一也成就了各种不同的漂亮算法,看了这些实现,也让我开拓了思维,这个世界的方案永远没有最完美的只有最合适的- ! 1.贪心算法概念 贪心算法也叫贪婪算法,当然叫法随意.主要目的是在问题求解时,做出最正确的判断= =,这不是贪心是啥?在计算机工程领域当中,就是说不考虑整体最优算法而是从局部做到最优解.当然贪心是算法不能对所有的问题都能得到整体都最优解,但对多数个问题还是能得到近

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

基础算法之二——枚举法

基础算法之二--枚举法"赛利的硬币" 题目描述 赛利有 12枚银币.其中有 11枚真币和1枚假币.假币看起来和真币没有区别,但是重量不同.但赛利不知道假币比真币轻还是重.于是他向朋友借了一架天平.朋友希望赛利称三次就能找出假币并且确定假币是轻是重.例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的.如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币.经过精心安排每次的称量,赛利保证在称三次后确定假币. 输入数据 输入有三行,每行表示一次称量的结果.赛利事先

贪心算法-跳跃游戏二

给定一个非负整数数组,假定你的初始位置为数组第一个下标. 数组中的每个元素代表你在那个位置能够跳跃的最大长度. 你的目标是到达最后一个下标,并且使用最少的跳跃次数. 例如: A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2.(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,到达最后一个下标.一共两次) 输入格式 第一行输入一个正整数 n(1≤n≤100) ,接下来的一行,输入 n 个整数,表示数组 A. 输出格式 最后输出最少的跳跃次数. 样例输入 5 3 1 1 1 1

贪心算法练习(二)

NOIP2002_T1_均分纸牌 AYYZOJ p1030 COGS p98 分析:见此课件的例7 程序:见NOIP2002 提高组 贪心算法_取数游戏 AYYZOJ p1425 分析:本题可以这样理解,有2n个数,A从开头取的话取第一个,给对手留下的是第2个和第2n个,即对手只能选偶数位的数,A以此法可以取走全部的奇数位的数,同理也可以取走偶数位的数.所以,只要将所有奇数位和偶数位的数比较,大的A选,小的对手选,即可 1 var 2 a,n,i,suma,sumb:longint; 3 beg

算法基础--贪心算法

贪心算法 算法描述 什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高. 比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,如果满足贪心选择性质,那么可以进一步降低时间复杂度,达到线性级别的. 什么是贪心选择性质呢,简单说就是:每一步都做出一个局部最优的选择,最终的结果就是全局最优.注意哦,这是一种特殊性质,其实只有一部分问题拥有这个性质. 比如