枚举法解决百元买百鸡精品课件
枚举法解决百元买百鸡-文档资料18页PPT
枚举法解决百元买百鸡-文档资料
56、极端的法规,就是极端的不公。 ——西 塞罗 57、法律一旦成为人们的需要,人们 就不再 配享受 自由了 。—— 毕达哥 拉斯 58、法公共 的利益 ;一部 分靠有 害的强 制,一 部分靠 榜样的 效力。 ——格 老秀斯 59、假如没有法律他们会更快乐的话 ,那么 法律作 为一件 无用之 物自己 就会消 灭。— —洛克
60、人民的幸福是至高无个的法。— —西塞 罗
6、最大的骄傲于最大的自卑都表示心灵的最软弱无力。——斯宾诺莎 7、自知之明是最难得的知识。——西班牙 8、勇气通往天堂,怯懦通往地狱。——塞内加 9、有时候读书是一种巧妙地避开思考的方法。——赫尔普斯 10、阅读一切好书如同和过去最杰出的人谈话。——笛卡儿
多种解法求百钱百鸡问题
学号:0121210680225《算法设计与分析B》大作业题目多种解法求百钱百鸡问题学院计算机科学与技术学院专业软件工程班级Sy1201姓名李安福指导教师何九周2014 年12 月26 日多种解法求百钱百鸡问题摘要:中国古代数学家张丘建提出的“百钱买百鸡”可以采用蛮力法来解决。
本文给出了百钱百鸡问题的描述,采用蛮力法来解决这个问题,并通过分析对算法进行了优化,进一步提高了解决此问题的效率。
关键字:枚举,执行效率,蛮力法,不定方程,循环变量。
1引言蛮力法是一种简单直接地解决问题的方法,通常直接基于问题的描述和所涉及的概念定义。
这种方法经过很少的思考,把问题的所有情况或所有的过程交给计算机去一一尝试,从中找出问题的解。
由于计算机运算速度快,在解决问题时可采用这种“懒惰”的策略。
蛮力法的主要优点在于它是有广泛的适用性和简单性;它的缺点是大多数蛮力算法的效率都不高。
2问题概述 百钱百鸡问题:中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?3问题的分析题目分析与算法设计这是一个古典数学问题我们假设公鸡、母鸡和小鸡的个数分别为x,y,z,那么买公鸡的钱数为5x ,买母鸡的钱数为3y ,买小鸡的钱数为z/3;再由题意,x,y 和z 的和为100,问题化为可三元一次方程组,该问题的数学模型如下:⎩⎨⎧=++=++)(100)(1003/35百鸡百钱z y x z y x这里x,y,z 为正整数,且z 是3的倍数;由于鸡和钱的总数都是100,可以确定x,y,z 的取值范围:1) x 的取值范围为1~20 2) y 的取值范围为1~33 3) z 的取值范围为1~99对于这个问题我们可以用穷举的方法,遍历x,y,z 的所有可能组合,最后得到问题的解。
4算法设计 4.1算法设计14.1.1数据要求问题中的常量: 无无问题的输出:int x,y,z /*公鸡、母鸡、小鸡的只数*/4.1.2初始算法1.初始化为1(循环语句中初始值为1);2.计算x循环,找到公鸡的只数;3.计算y循环,找到母鸡的只数;4.计算z循环,找到小鸡的只数;5.结束,程序输出结果后退出。
2.4.2基于枚举算法的问题解决 精品教学设计 人教_中图版(2019) 高中信息技术必修1
课题2.4.2 基于枚举算法的问题解决教学过程图1 分析问题示例设计算法:根据问题分析,只要一一列举出4位数字AABB中A与B的所有可能组合,保证A≠B 且A≠0.再验证二次方问题,就可以得到同题的解。
因此,该问题可使用枚举算法求解完成用枚举算法实现解“票据中的数字”问题,如何进行问题拆解?○1本问题的已知条件是什么?求解目标是什么?隐含什么样的关系?➢一一列举可能的解,即枚举范围是多少?➢逐一检验可能的解,判断条件是什么?○2设计算法:输入数据、处理数据、输出结果逐一列举,用循环结构就可以解决。
一一校验,则需要用到分支结构,验证哪些情况满足问题的条件,如果满足就输出。
编程实现与调试:import mathfor A in range(1,10):for B in range(0,10):if A!=B: 学生体验枚举法解决问题的全过程学生通过该问题理解和掌握语句之间的逻辑关系,通过程序的缩进来体现逻辑关系观察与思考,完成算法流程图,总结枚举算法的基本原理。
观察程序,体会用计算机程序解决问题的优势。
k=A * 1000+A * 100+B * 10+Bc=int(math.sqrt(k))if c*c==k:print("票据编号是:",k)二、枚举算法枚举算法:依据问题的已知条件,确定答案的大致范围,在此范围内列举出它所有可能情况的方法。
枚举算法适合解决求解的答案数量有限,并且可能的答案是能按照某种规则列举出来的问题。
例如,用枚举法解决一些数学问题(“韩信点兵”“鸡兔同笼”等),益智游戏和逻辑推理等。
三、应用枚举算法解决问题1、-水仙花数“水仙花数”是指一个三位自然数,其各位数字的立方和等于该数本身。
例如153是“水仙花数”,因为:153 = 13 + 53 + 33。
已知条件: 一个三位自然数,其各位数字的立方和等于该数本身求解目标 : 求水仙花数已知与未知的关系 :要求解的这个数必须同时满足所有的已知条件。
枚举法
枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。
能使命题成立者,即为问题的解。
采用枚举算法解题的基本思路:(1)确定枚举对象、枚举范围和判定条件;(2)一一枚举可能的解,验证是否是问题的解下面我们就从枚举算法的的优化、枚举对象的选择以及判定条件的确定,这三个方面来探讨如何用枚举法解题。
枚举算法应用例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡。
到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。
现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。
下面是解这个百鸡问题的程序var x,y,z:integer;beginfor x:=0 to 100 dofor y:=0 to 100 dofor z:=0 to 100 do{枚举所有可能的解}if (x+y+z=100)and(x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); {验证可能的解,并输出符合题目要求的解} end.上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序:var x,y,z:integer;beginfor x:=0 to 100 dofor y:=0 to 100-x dobeginz:=100-x-y;if (x*3+y*2+z div 3=100)and(z mod 3=0)thenwriteln('x=',x,'y=',y,'z=',z);end;end.未经优化的程序循环了1013次,时间复杂度为O(n3);优化后的程序只循环了(102*101/2)次,时间复杂度为O(n2)。
枚举法
枚举法在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法.枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。
这两种类型经常(但不总是)重叠。
特点将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。
例如:找出1到100之间的素数。
需要将1到100之间的所有整数进行判断。
枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点:1、得到的结果肯定是正确的;2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。
3、通常会涉及到求极值(如最大,最小,最重等)。
4、数据量大的话,可能会造成时间崩溃。
结构枚举算法的一般结构:while循环。
首先考虑一个问题:将1到100之间的所有整数转换为二进制数表示。
算法一:for i:=1 to 100 do begin将i转换为二进制,采用不断除以2,余数即为转换为2进制以后的结果。
一直除商为0为止。
end;算法二:二进制加法,此时需要数组来帮忙。
program p;var a:array[1..100] of integer; {用于保存转换后的二进制结果} i,j,k:integer;beginfillchar(a,sizeof(a),0); {100个数组元素全部初始化为0}for i:=1 to 100 do begink:=100;while a[k]=1 do dec(k); {找高位第一个为0的位置}a[k]:=1; {找到了立刻赋值为1}for j:=k+1 to 100 do a[j]:=0; {它后面的低位全部赋值为0}k:=1;while a[k]=0 do inc(k); {从最高位开始找不为0的位置}write('(',i,')2=');for j:=k to 100 do write(a[j]); {输出转换以后的结果}writeln;end;end.枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。
百钱百鸡问题
百鸡问题
公元5世纪末,我国古代数学家张丘建在他所撰写的《算经》中,提出了这样的一个问题:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一.百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?”意思是公鸡5元一只,母鸡3元一只,小鸡1元三只。
用100元100只鸡,求公鸡、母鸡、小鸡各买几只。
假设a 为公鸡只数,b 为母鸡只数,c 为小鸡只数,如果把问题转化为n 元钱买n 只鸡,针对上述问题n =100,根据题意可得出下面的约束方程:
53/3%30
a b c n
a b c n c ++=++==
用穷举法实现如下所示:
图4.3 穷举法求解百鸡问题
这个算法有三重循环,枚举公鸡数量的外循环,枚举母鸡数量的中间循环以及枚举小鸡数量的内循环,主要执行时间取决于内循环的循环体的执行次数,需要执行(n+1)3次,当n=100时,内循环需要执行大于100万次。
考虑到n元钱只能买到n/5只公鸡或n/3只母鸡,因此有些组合可以不必考虑,而小鸡的数目又取决于公鸡和母鸡的只数,上述的内循环可以省去。
图4.3 改进算法求解百鸡问题
改进算法只有两层循环,枚举公鸡数量的外循环和枚举母鸡数量的内循环,内循环的执行次数为(n/5+1) (n/3+1)。
当n=100时,内循环执行21*34=714次,这和穷举算法的100万次相比,仅为原来的万分之七,有重大改进。
算法:枚举法
} if(mark){ //是素数进行输出
cout<<" "<<i;
}
}
枚举法
例题:找出1到100之间的素数。
程序优化后如右图。
优化后的程序没有引入数学函数 和float 变量。
对于for循环初始条件j=2,只执行1 次,而对于约束条件j*j<=i,要执 行多次。因此此处还可以优化。
定义变量int t=sqrt(i);约束条件改 为j<=t;
#include<iostream> #include<cmath> using namespace std;
int main() {
return 0; }
int i,j; cout<<2; //输出第一个素数 for(i=3;i<=100;i+=2){ //只检查>=3的奇数
bool mark=true; //默认是素数
double ret=x; ret=a*ret+b; ret=ret*x+c; ret=ret*x+d; return ret; }
枚举法
例题 一元三次方程求解(noip2001tg)
编程,主函数
int main(){ int a,b,c,d; cin>>a>>b>>c>>d; float i; double y1,y2; int count=0;//记录解的个数; for(i=-100;i<100;i+=1){ y1=fx(a,b,c,d,i); y2=fx(a,b,c,d,i+1); double t=y1*y2; if(t==0){//i和i+1至少1个是解 if(y1==0){ if(count){cout<<" "; } cout<<i; count++; if(y2==0){ cout<<" "<<i+1;
优化枚举算法 提升计算思维 ——以“百鸡百钱问题”为例
优化枚举算法提升计算思维 ——以“百鸡百钱问题”为例发表时间:2020-12-30T15:07:59.553Z 来源:《中国教师》2020年第26期作者:屈玫琦[导读] 如今,在教学中培养和提升学生的计算思维已成了教学中的重中之重。
屈玫琦杭州市富阳区场口中学摘要:如今,在教学中培养和提升学生的计算思维已成了教学中的重中之重。
本文主要通过在“百钱百鸡问题”的教学中引导学生对枚举算法进行优化和完善来提升学生的计算思维,并迁移到类似问题中,提高学生解决问题的实际能力。
关键词:计算思维;枚举算法;算法优化一、计算思维与枚举法概述1.计算思维简述计算思维并不是一个新概念,人生而有之。
从图灵等人对计算机科学的研究以来,100年的时间,我们进入了信息社会。
计算机领域的发展扩大了计算思维的影响范围,使之成为继实证思维和逻辑思维之后被确立的第三种科学思维模式。
从中小学开始,计算思维就在学科教学中被朦朦胧胧的使用,却从没有向如今般受到重视。
2006年,周以真提出计算思维(Computational Thinking)的概念在全球的计算机教育届引起了广发的关注。
各科学家普遍认为计算思维是计算机领域最具基础性和普遍性,到2050年,每个地球公民都应该掌握计算思维 [1]。
2017年,我国的《普通高中信息技术课程标准》明确指出,计算思维是学科的四大核心素养之一,是个体运用计算机科学领域的思想方法,在形成问题解决方案的过程中产生的一系列思维活动。
具备计算思维的学生在具体的信息活动中能够采用计算书能够处理的方式界定问题,抽象特征、建立结构模型合理组织数据,并运用合理的算法解决问题。
[2课程标准]2.枚举法概述枚举法也称穷举法,是指在有穷的可能解得集合中,逐个搜索集合的每一个元素,用问题给定的检验条件去判断此解是否符合条件,若满足条件,此元素为该问题的一个解。
枚举法是浙江信息技术学业水平考试要求掌握的算法,因为其简单、易理解等特点,也作为信息技术程序设计课程的入门算法。
利用“百钱买百鸡”探讨穷举法
利用“百钱买百鸡”探讨穷举法山东省鱼台县第一中学范海涛2009年7月23日16:35 浏览:97 专家浏览:0 | 评论:10 专家评论:0利用“百钱买百鸡”探讨穷举法【课标要求】(1)了解穷举法的基本概念及用穷举法设计算法的基本过程。
(2)能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题。
【教材处理】由于这是学生首次接触用非解析法解题,如果要求学生很快掌握其基本过程并且能对算法进行优化,将是不现实的。
尤其是考虑到学生的信息技术基础参差不齐,可能差距较大,基础差的学生在可能不能接受太多的内容;而且,就算能“吸收”到全部内容,未必就能全部“消化”。
本节课选取来自《张邱建算经》的百钱买百鸡问题作为本次教学的主题。
这样既能提高学生学习的兴趣,又能使学生容易掌握知识,还可以培养学生的民族自豪感和通过建立数学模型和设计程序解决实际问题的习惯。
【学生情况分析】1、学生在本节课前学习高中信息技术新课程的《算法与程序设计》模块已经有一段时间了,学生对算法和程序设计有了一定的认识,但是在面对实际问题时如何设计算法并且用程序实现算法来解决问题上,尤其是对于无法用解析法解决或者是用解析法解决比较困难的问题如何设计算法还是没有什么思路;2、“百钱买百鸡”问题的数学模型是解不定方程,学生在初中的数学课上学过。
本次课在原有知识的基础上,通过对实际问题的分析找到合适的数学模型,使学生基本理解和掌握穷举法解题的思路;【教学目标】1、知识与技能(1)了解非解析法解题的基本思路;(2)理解和掌握穷举法解题的思路,2、过程与方法经历分析问题、建立数学模型、编写和调试程序,得到最终结果的过程,理解和掌握用穷举法解题的基本思路与过程;3、情感态度与价值观(1)通过主题任务的完成,激发民族自豪感和自身的成就感;(2)通过小组讨论与探究活动,提高团队合作能力,促进探究的热情;(3)通过结合学习生活的实际例子,进一步提高利用信息技术解决学习、生活问题的能力。
第14课 枚举算法 课件(25张PPT)
(0张50元)24张10元
(1张50元)19张10元
(2张50元)14张10元
(3张50元) 9张10元
(4张50元) 4张10元
随堂练习
一张单据上有一个5位数的编号,千位数是1,百位数是7,
个位数是8,万位数和十位数已经模糊不清,只知道该5位数
是7或11的倍数,找出所有满足这些条件的5位数并输出。
完所有的可能解,所以可采用循环结
构来实现。
而在利用问题提供的约束条件筛选、判断
解的过程中,则需要用到分支结构。
新知讲解
枚举算法的流程图
如图所示。
新知讲解
三、枚举算法的程序实例
我国古代数学家张丘建在他的《算经》
中提出了著名的“百钱买百鸡”问题:鸡
翁一,值钱五;鸡母一,值钱三;鸡雏三
,值钱一;百钱买百鸡,问翁、母、雏各
NO. ? 17 ? 8
该题要列举的对象有两个,分别是万位数和个位数。
课堂小结
板书设计
一、枚举算法的思想和步骤
二、枚举算法的流程图表示
三、枚举算法的程序实例
作业布置
在联欢会上,小明提议大家来玩数7
的游戏。
游戏规则:从1开始数起,每个人数
一个数,凡是遇到7的倍数就要喊“过
”,这样一直数到100为止。
弃不符合条件的解。
一一列举;逐个检验
新知讲解
在很多时候,由于人类大脑的运算和处理能
力相对有限,无法立刻得出某个问题的可能解
或最优解,如复杂密码的破解。
但是,人们可以利用计算机运算速
度快和存储容量大的特点,采用最原
始的破解方法——枚举法。
新知讲解
一、枚举算法的思想和步骤
小学数学《常规应用题的解法——枚举法》ppt
知识要点
我们在课堂上遇到的数学问题,有一些需要计算总数或种类的趣 题,因其数量关系比较隐蔽,很难利用计算的方法解决。我们 可以抓住对象的特征,按照一定的顺序,选择恰当的标准,把 问题分为不重复、不遗漏的有限种情形,通过一一列举或计数, 最终达到解决目的。这就是枚举法,也叫做列举法或穷举法。
余下的人还有4,8,12,16,20,24,28. 第三次站出来的人有4,12,20,28. 第四次站出来的人是8,24。 第五次只有16号,也是最后一个。 答:到第5次这些人全部都站出来了,最后站出来的人
应是第16号。 LOGO
总结:
本题应用了排除法,通过 列举每次变化后的数,最 后余下的数就是我们要找 的数。
LOGO
1.枚举法在数字组合中的应用。
按照一定的组合规律,把所有组合的数一一列举出来。
【例1】用数字1,2,3组成不同的三位数, 分别是哪几个数?
【思路点拨】根据百位上的数字的不同分为3类。 第一类:百位上为1的有:123 132 第二类:百位上为2的有:213 231 第三类:百位上为3的有:312 321
LOGO
巩固练习
1、从甲地到乙地有2条路可走,由乙地到丙地 有3条路可走,那么由甲地经乙地到丙地共有 几条路可走?
2、有7张卡片上写着数字2,3,4,5,6,7, 8,从中抽出两张,组成的所有的两位数是奇数 的个数是多少?
3、一把钥匙只能开一把锁,现在有4把钥匙。 但不知哪把钥匙开哪把锁,最多要试多少次就 能配好全部的钥匙和锁?
复又不遗漏。 3.排除不符合条件的情况,不断缩小列举的范围。
二、枚举的方法常用的有: 1、列表枚举。如我们第6讲中解决鸡兔同笼问题时采用 的列表法,就是采用列表枚举的方法。 2、画图枚举,为了更清楚地表示出所有可能的情形。用 画树图枚举法,能做到形象直观,条理分明,简炼易懂。 特别适用于找出所有的情形或结果。
枚举法解题
枚举法解题摘要:一、枚举法的概念二、枚举法的分类1.完全枚举法2.条件枚举法三、枚举法的应用1.应用场景2.实际案例分析四、枚举法的优缺点1.优点2.缺点五、总结正文:一、枚举法的概念枚举法是一种求解问题的方法,它通过列举所有可能的解决方案来寻找问题的答案。
这种方法适用于问题范围明确,可以通过穷举所有可能来求解的情况。
二、枚举法的分类1.完全枚举法完全枚举法指的是对问题的所有可能解决方案进行逐一列举,直到找到满足条件的解决方案为止。
这种方法适用于问题范围较小,可以通过列举所有可能性来求解的情况。
2.条件枚举法条件枚举法是在完全枚举法的基础上,对问题进行一定程度的筛选,只保留满足某一条件的解决方案进行列举。
这种方法适用于问题范围较大,但可以通过限定条件来缩小搜索范围的情况。
三、枚举法的应用1.应用场景枚举法广泛应用于数学、物理、化学等自然科学领域,以及计算机科学、逻辑学等社会科学领域。
例如,在组合数学中求解排列组合问题,在计算机科学中寻找算法最优化解等。
2.实际案例分析以组合数学中的“百鸡百钱”问题为例,假设鸡和钱的总数为100,需要找到所有可能的鸡和钱数量组合。
这个问题可以通过枚举法来求解。
首先列举所有可能的鸡的数量(1-100),然后针对每个鸡的数量,列举所有可能的钱的数量(1-100),直到找到满足条件的鸡和钱数量组合为止。
四、枚举法的优缺点1.优点枚举法能够针对问题进行全面的分析,不容易遗漏解题思路。
对于某些问题,通过枚举法可以找到唯一的解,避免了其他方法可能出现的近似解或多种解的情况。
2.缺点枚举法的缺点在于,当问题范围较大时,需要列举的数量会非常庞大,导致计算量过大,甚至无法得到结果。
此外,枚举法对于一些具有规律的问题,可能无法发现和利用规律,降低了解题效率。
五、总结枚举法作为一种求解问题的方法,在一定范围内具有较好的适用性。
经典流程图
常用算法流程图及程序
1、枚举法:1??47(百位和千位被涂抹掉了)是个五位数,要逐一输出所有能被57或67整除的五位数,并统计这样的五位数有几个。
2、枚举法:1? 4?7(十位和千位被涂抹掉了)是个五位数,要逐一输出所有能被57或67整除的五位数。
3、枚举法:逐一输出所有3位数水仙花数(即个位数3+十位数3+百位数 3 =
这个数)
4、枚举法:百鸡百钱问题:100元买100只鸡(三种鸡,5元一只公鸡,3元一只母鸡,1元三只小鸡),输出每一种买法的各种鸡的数量。
5、枚举法:输出1000以内的所有的素数之和
6、冒泡排序:对十个数按非递减方式(即升序)冒泡排序,并输出排序后的这十个数。
其中i 是外循环变量,用来控制需要进行多少次处理,j 是内循环变量,用来控制每次处理需要进行多少次的俩俩比较。
7、顺序查找:100个数中顺序查找key,如找到则输出是第几个元素,否则输出0(如果输出0的话,表示没找到)。
8、对分查找:100个数(必须事先排好序)中对分查找key,如找到则输出是第几个元素,否则输出0(如果输出0的话,表示没找到)。
i 是用来表示对分查找的起点变量,j是用来表示对分查找的终点变量。
c语言枚举法(穷举法)
for (x=0;x<=14;x++)
for (y=0;y<=25;y++)
if (7*x+4*y==100 )
{
z=100-x-y;
printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);
}
}
第3章 程序控制结构
课堂讨论:谁做的好事?
有四位同学中的一位做了好事,不留名,表扬信来了 之后,校长问这四位是谁做的好事。
三重循环
第3章 程序控制结构
void main()
{
int x,y,z;
for (x=0;x<=100;x++)
for (y=0;y<=100;y++)
for (z=0;z<=100;z++)
?
{
if (x+y+z==100 && 5*x+3*y+z/3==100 )
printf("x=%d,y=%d,z=%d\n",x,y,z);
#include<stdio.h>
void main( )
{
char thisman;
int sa,sb,sc,sd,cond;
for (thisman='A'; thisman<='D'; thisman++)
{
sa=(thisman != 'A');
sb=(thisman == 'C');
sc=(thisman == 'D');
百钱买百鸡问题
算法经典问题系列1 百钱买百鸡问题
一说起唐朝 人们就会情不自禁地想起诗歌 绝对没有人会提到数学在数
学上 虽说唐代并没有产生与其前的魏晋南北朝或其后的宋元相媲美的大师 却在数学教育制度的确立和数学典籍的整理方面有所建树.长达近三百年的唐代在数学方面最有意义的事情莫过于《算经十书》的整理和出版 这是高宗李治下令编撰的。
除了《周牌算经》《九章算术》《海岛算经》和《缀术》以外 《算经十书》中至少还有三部值得一提 分别是《孙子算经》《张丘建算经》和《缉古算经》'这三部书的共同特点是 每一部都提出了一个非常有价值的问题 并以此传世。
《张丘建算经》成书于公元5世纪 作者是北魏人.书中最后一道题堪称亮
点 通常也被称为"百钱买百鸡"问题 民间则流传着县令考问神童的佳话书中原文如下
今有鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买鸡百只
问鸡翁、母、雏各几何?
题目的意思是 公鸡5文钱1只 母鸡3文钱1只 小鸡1文钱买3只
现在用100文钱共买了100只鸡 问 在这100只鸡中 公鸡、母鸡和小鸡各是多少只?(设每种至少一只)算法分析
此题很显然是用枚举法 我们以三种鸡的个数为枚举对象(分别设为
x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件 穷举各种鸡的个数。
枚举法 常常称之为穷举法 是指从可能的集合中一一枚举各个元素 用
题目给定的约束条件判定哪些是无用的 哪些是有用的。
能使命题成立者 即为问题的解。
1.采用枚举算法解题的基本思路
2.确定枚举对象、枚举范围和判定条件。
Scratch趣味数学之百元买百鸡
Scratch趣味数学之百元买百鸡作者:陈新龙来源:《电脑报》2020年第20期我正在研究一道数学题,古代数学家张丘建在《算经》中的百元买百鸡问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,一百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?公鸡五元一只,母鸡三元一只,小鸡一元三只,现有一百元要买一百只鸡可以有几种买法?“百鸡问题”在世界上首次提出三元一次不定方程及解法,也是经典的奥数题目。
如果手工计算的话就算知道解法也不容易,但用Scratch编程用穷举法来解这道题目的话,就显得简单直接了。
编程之前我们先在草稿纸上根据题目写出不定方程。
设X:公鸡Y:母鸡Z:小鸡则X+Y+Z=100(只)5X+3Y+Z/3=100(元)為了编程时控制总运算量,先根据总价100元估算公鸡、母鸡、小鸡的数量范围,公鸡的数量不能超过20只,母鸡的数量不超过33只,小鸡的数量不超过100只,在做题之前我们先把这些关系整理清楚,就方便多了。
算法代码核心部分如图1。
设定四个变量,其中三个变量分别对应公鸡、母鸡、小鸡,还有一个变量对应列表值(目的是为了进行列表输出)。
因为方程的解不唯一,还要设定三个列表存储方程的解。
定义公鸡、母鸡、小鸡的初始值要分别在各自循环前定义,并且不要忘记在每次循环结束前对公鸡、母鸡、小鸡的数目增加1,利用三重循环嵌套进行穷举计算,最终获得结果。
之前我们已经分析了公鸡、母鸡、小鸡的取值范围,相当于确定了程序循环范围,也就是公鸡循环20次,母鸡循环33次,小鸡循环100次,3层循环嵌套,在最里层判断如果X+Y+Z=100与5X+3Y+Z/3=100成立,即获得一组解,每获得一组解将“鸡的列表值”加1,将X、Y、Z数字存入列表相应位置,当循环完成后就可以获得全部解了(如图2)。
外观方面可以像我一样增加一些对话环节,大家可以在网盘下载源代码参考。
百钱买百鸡我们用到了穷举法(枚举法),所谓穷举法,顾名思义就是穷尽每一种可能性,通常在找不到解决问题的规律时对可能是解的众多候选解按照某一顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主讲教师:门瑞
信息工程学院
❖
9、 人的价值,在招收诱惑的一瞬间被决定 。20.9.3020.9.30Wednesday, September 30, 2020
❖
10、低头要有勇气,抬头要有低气。21:09:2321:09:2321:099/30/2020 9:09:23 PM
❖
11、人总是珍惜为得到。20.9.3021:09: 2321:0 9Sep-2 030-Se p-20
main() {
int x,y,z;
枚举次数20;x++)
for(y=1;y<=33;y++)
if(((100-x-y)%3==0)&&(5*x+3*y+(100-x-y)/3==100))
{z=100-x-y;
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);
信息工程L学O院GO
知识拓展
❖试用枚举法解决以下两个问题
• 从1—10的10个数中,每次取2个数,要使它们的 和大于10,一共有多少种取法?
• 从学校到少年宫有4条东西走向的马路和3条南北走 向的马路,小明从学校步行到少年宫(只许向东或 向南行走),最多有多少种走法?
信息工程L学O院GO
LOGO
C语言解法三:
main() {
枚举次数:
3次!
int k;
for(k=1;k<=3;k++)
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",4k,25-7k,z);
}
信息工程L学O院GO
枚举法
❖优化策略
• 对问题多加分析,减少循环重数和次数。 • 合理选择用于枚举的变量。 • 减少每种情况的判断时间。 • 是否有其他更好的方法。
❖
15、一个人炫耀什么,说明他内心缺 少什么 。。2020年9月 下午9时9分20.9.3021:09September 30, 2020
❖
16、业余生活要有意义,不要越轨。2020年9月30日 星期三 9时9分 23秒21:09:2330 September 2020
❖
17、一个人即使已登上顶峰,也仍要 自强不 息。下 午9时9分23秒 下午9时 9分21:09:2320.9.30
执行的速度严重变慢。
信息工程L学O院GO
百元买百鸡问题
【例2】鸡翁一,值钱五,鸡母一,值钱三,鸡 雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各 几何?
解题思路:
设鸡翁、鸡母、鸡雏的数量分别为x,y,z, 则有以下方程
x+y+z=100 5x+3y+z/3=100 此三元一次方程有多个解,可用枚举法求解。
谢谢大家
LOGO
}
} LOGO
百元买百鸡问题
有没有更好 的解法呢?
信息工程L学O院GO
百元买百鸡问题
x+y+z=100 5x+3y+z/3=100
分析题意可知: k只能取1,2,3
化 简
y=25-7/4*x z=75+3/4*x
令x=4k
x=4k y=25-7k z=75+3k
信息工程L学O院GO
百元买百鸡问题
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);
}
信息工程L学O院GO
百元买百鸡问题
有没有更 好的解法 呢?
限定变量的取值范围
x的取值范围是1<=x<=20 y的取值范围是1<=y<=33
减少循环的层数、判断时间
z=100-x-y
信息工程L学O院GO
百元买百鸡问题
C语言解法二:
}
信息工程L学O院GO
百元买百鸡问题
C语言解法一:
main() {
int x, y, z;
枚举次数: 100*100*100 =100万次!
for(x=1;x<=100;x++)
for(y=1;y<=100;y++)
for(z=1;z<=100;z++)
if((z%3==0)&&(x+y+z==100)&&(5*x+3*y+z/3==100))
LOGO
枚举法实例
什么是枚举法
❖基本思想
• 枚举也称穷举,指的是从问题可能的解的集 合中一一列举各元素。
• 用题目给定的条件判定哪些是无用的,哪些 是有用的。能使命题成立,即为其解。
• 本质上属于搜索算法
信息工程L学O院GO
什么是枚举法
❖特点
• 容易理解,步骤单一。 • 得到的结果肯定是正确的。 • 通常会涉及到求极值(如最大,最小等)。 • 数据量大的话,可能会造成时间崩溃。
信息工程L学O院GO
引子
【例1】以下式子中的每个汉字代表一个数字,求出 这些汉字代表的数字分别是多少?
慕课制作组
X
慕
组组组组组组
信息工程L学O院GO
枚举法
❖计算机解决枚举问题
• 算法简单、精确度高。 • 常用多重循环解决枚举问题(while循环、for循环)。 • 效率低——当问题的规模变大,循环的阶数增加,
信息工程L学O院GO
百元买百鸡问题
C语言解法一:
main() {
int x, y, z; for(x=1;x<=100;x++)
for(y=1;y<=100;y++) for(z=1;z<=100;z++) if((z%3==0)&&(x+y+z==100)&&(5*x+3*y+z/3==100)) printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);
❖
12、人乱于心,不宽余请。21:09:2321:09:2321:09Wednesday, September 30, 2020
❖
13、生气是拿别人做错的事来惩罚自 己。20.9.3020.9.3021:09:2321:09:23September 30, 2020
❖
14、抱最大的希望,作最大的努力。2020年9月30日 星期三 下午9时9分23秒21:09:2320.9.30