百鸡百钱问题及其算法分析
算法-经典趣题-百钱买百鸡
算法-经典趣题-百钱买百鸡本⽂为joshua317原创⽂章,转载请注明:转载⾃⼀、问题百钱买百鸡是⼀个⾮常经典的不定⽅程问题,最早源于我国古代的《算经》,这是古代著名数学家张丘建⾸次提出的。
百钱买百鸡问题的原⽂如下:鸡翁⼀,值钱五,鸡母⼀,值钱三,鸡雏三,值钱⼀,百钱买百鸡,问翁、母、雏各⼏何?这个问题的⼤致意思是公鸡5⽂钱1只,母鸡3⽂钱1只,⼩鸡3只1⽂钱,如果⽤100⽂钱买100只鸡,那么公鸡、母鸡和⼩鸡各应该买多少只呢?⼆、分析百钱买百鸡问题中,有三个变量:公鸡数量、母鸡数量和⼩鸡数量,分别设为x、y和z。
这三者应该满⾜如下关系:x+y+z=1005x+3y+z/3=100这⾥有三个变量,两个⽅程,因此是⼀个不定⽅程问题。
这将导致求解的结果不只⼀个。
可以根据上述两个⽅程来求出所有可能的结果。
三、编程package com.joshua317;public class Bqbj {public static void main(String[] args) {int n = 100;int m = 100;getBqbj(n,m);}/*** 百钱买百鸡* @param n 数量* @param m 钱数*/public static void getBqbj(int n, int m) {int x, y, z;for (x = 0; x <= n; x++) {for (y = 0; y <= n; y++) {z = n - x -y;if (z > 0 && z%3 == 0 && 5*x+3*y+z/3 == m) {System.out.println("x = " + x + ", y = " + y + ", z=" + z);}}}}}结果为:本⽂为joshua317原创⽂章,转载请注明:转载⾃。
百鸡百钱问题解题技巧
百鸡百钱问题解题技巧
百鸡百钱问题是一个经典的数学问题,它涉及到线性方程组的求解。
在这个问题中,有100只鸡和100元钱,公鸡5元一只,母鸡3元一只,小鸡1元三只。
我们需要找出公鸡、母鸡和小鸡各有多少只,使得总价值等于总数量。
解题技巧如下:
1、设公鸡、母鸡和小鸡的数量分别为x、y 和z 只。
2、根据题目条件,我们可以建立以下方程:
x + y + z = 100 (总数量)
5x + 3y + z/3 = 100 (总价值)
3、解这个方程组,找出x、y 和z 的值。
4、由于z 是3的倍数,我们可以先从z 入手,解出z 的值。
5、将z 的值代入方程组中,解出x 和y 的值。
6、最后,验证解的合理性,确保x、y 和z 都是非负整数。
通过以上步骤,我们可以求解百鸡百钱问题。
需要注意的是,由于这是一个线性方程组问题,解可能有多个,因此需要验证解的合理性。
百钱买百鸡问题
百钱买百鸡问题百钱买百鸡问题题⽬:公元前5世纪末,中国古代数学家张丘建在他的《算经》中提出了著名的 “百钱买百鸡问题”:鸡翁⼀,值钱五,鸡母⼀,值钱三,鸡雏三,值钱⼀,百钱买百鸡,问翁、母、雏各⼏何?即⼀百个铜钱买了⼀百只鸡,其中公鸡⼀只5钱、母鸡⼀只3钱,雏鸡⼀钱3只,问⼀百只鸡中公鸡、母鸡、雏鸡各多少?三种解法O(n)思路:利⽤⾼中的参数⽅程求解/*** x + y + z = 100* 5 * x + 3 * y + z / 3 =100* 引⽤参数t来表⽰ x、y、z得:** x = ( 4 * t - 300 ) / 3 ①* y = ( 600 - 7 * t ) / 3 ②* z = t ③** 有①②得:* 4 * t >= 300 ④* 600 - 7 * t >= 0 ⑤** ④⑤可得* 75 =< t <86*/public static void way1(){ //O(n)//公鸡数量:x 母鸡数量:y 雏鸡数量:zint x,y,z;//先确定雏鸡数量范围然后反确定公鸡母鸡数量for (int t = 75; t < 86 ; t++){x = ( 4 * t - 300 ) / 3;y = ( 600 - 7 * t ) / 3;z = t;//输出符合题⽬中两个公式的x、y、zif ((5 * x + 3 * y + z / 3 == 100) && (x + y + z == 100)){System.out.println("公鸡:"+x+" 母鸡:"+y+" 雏鸡:"+z);}}}O(n**2)思路:确定公鸡和母鸡,然后⽤体中的两个公式代换public static void way2(){ //O(n**2)//公鸡数量:x 母鸡数量:y 雏鸡数量:zint x,y,z;//公鸡最多买20只for (x=0;x<=20;x++){//母鸡最多买33只for(y=0;y<=33;y++){//雏鸡和公鸡母鸡关系z=100-x-y;//雏鸡数量⼀定是三的倍数,且三种鸡⼀共百钱if (5*x+3*y+z/3==100 && z%3==0){System.out.println("公鸡:"+x+" 母鸡:"+y+" 雏鸡:"+z);}}}}O(n**3)思路:公鸡母鸡雏鸡都全循环⼀遍public static void way3(){ //O(n**3)//公鸡数量:x 母鸡数量:y 雏鸡数量:zint x, y, z;//公鸡最多买20只for (x = 0; x < 20; x++) {//母鸡最多买33只for (y = 0; y < 33; y++) {//雏鸡最多买300只for (z = 3; z < 300; z = z + 3) {//找到符合这两个公式的x、y、zif ((5 * x + 3 * y + z / 3 == 100) && (x + y + z == 100)) {System.out.println("公鸡数:" + x + "母鸡数" + y + "⼩鸡数" + z); }}}}}。
百钱买百鸡解题思路数学
百钱买百鸡这个题目是一个著名的数学难题,它要求用一百个钱币购买一百只鸡,其中公鸡x只,母鸡y只,小鸡z只,且x+y+z=100,且5x+3y+z/3=100。
使用现代计算机技术的优势,可以通过暴力穷举来解决这个问题。
小朋友也可以在Scratch编程中,通过引入变量和穷举法来实现这一过程。
首先,设置三个变量x、y和z,它们分别代表公鸡、母鸡和小鸡的数量。
设置一个计数器,用于显示穷举的执行时间。
然后,开始穷举。
从x的最小值开始,即0,依次增加到最大值,即100/5,检查是否满足x+y+z=100。
如果满足,继续检查是否满足5x+3y+z/3=100。
如果都满足,则表示找到了一个解。
在穷举过程中,可以使用计时器显示穷举的执行时间,以便学生了解求解过程的耗时情况。
最后,输出找到的所有解,包括公鸡、母鸡和小鸡的数量。
这些解可能有四种情况:公鸡0只,母鸡25只,小鸡75只;公鸡4只,母鸡18只,小鸡78只;公鸡8只,母鸡11只,小鸡81只;公鸡12只,母鸡4只,小鸡84只。
通过这种方式,可以使用Scratch编程解决这个数学难题,并且通过计时器显示执行时间,了解求解过程的耗时情况。
例9-8 百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡
例 9-8 百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡一只 5 钱、母鸡一只 3 钱,小鸡一钱 3 只,问一百只鸡中公鸡、母鸡、小鸡各多少)。
4.1 z=1 4.2 是否满足百钱,百鸡
4.2.1 满足,输出最终百钱买到的百鸡的结果 4.2.2 不满足,不做处理 4.3 变量增加,这里注意步长为 3 流程图
版权所有:东北大学计算中心
开始 定义x,y,z
x<=20?
N
Y N
y<=33?
Y
N
z<=99?
Y
百钱和百鸡?
N
Y
输出百鸡 的结果
结束
图 5-8 程序执行流程图
版权所有:东北大学计算中心
这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为 x,y,z,问题化为三 元一次方程组:
5x 3y z / 3 100(百钱)
x
y
ห้องสมุดไป่ตู้
z
100(百鸡)
这里 x,y,z 为正整数,且 z 是 3 的倍数;由于鸡和钱的总数都是 100,可以确定 x,y,z 的取值范围:
1) x 的取值范围为 1~20 2) y 的取值范围为 1~33 3) z 的取值范围为 3~99,步长为 3 对于这个问题我们可以用穷举的方法,遍历 x,y,z 的所有可能组合,最后得到问题的解。 数据要求 问题中的常量: 无 问题的输入: 无 问题的输出: int x,y,z /*公鸡、母鸡、小鸡的只数*/ 初始算法 1.初始化为 1; 2.计算 x 循环,找到公鸡的只数; 3.计算 y 循环,找到母鸡的只数; 4.计算 z 循环,找到小鸡的只数; 5.结束,程序输出结果后退出。 算法细化 算法的步骤 1 实际上是分散在程序之中的,由于用的是 for 循环,很方便的初始条件放 到了表达式之中了。 步骤 2 和 3 是按照步长 1 去寻找公鸡和母鸡的个数。 步骤 4 的细化
百钱百鸡问题的课程思政
百钱百鸡问题的课程思政百钱百鸡问题是一个经典的数学问题,它涉及到了数学、逻辑和实际生活中的情景。
它也可以成为课程思政中一个有趣的教学案例,通过这个问题可以引发学生对数学思维、逻辑思维以及生活中的实践运用的思考和学习兴趣。
百钱百鸡问题的问题描述是这样的:有一百只鸡和一百个钱,其中公鸡每只5元,母鸡每只3元,小鸡每只1元。
现在要用100元买100只鸡,问公鸡、母鸡、小鸡各有多少只?在课程思政中,可以通过百钱百鸡问题来引导学生进行数学思维的训练和逻辑思维的发展。
首先,让学生对问题进行分析,引导他们建立数学模型,通过代数方程的建立和解答,培养他们的数学运算能力和逻辑推理能力。
其次,引导学生对实际生活中的情景进行思考,如何用数学方法解决生活中的实际问题,培养学生的实际运用能力和创新能力。
在解决问题的过程中,学生会思考每只鸡的价格和数量之间的关系,同时也会思考不同种类的鸡之间的数量关系。
这样的思维活动可以培养学生的观察力、分析能力和解决问题的能力。
解决问题的过程也是一个探索过程,可以培养学生的好奇心和求知欲,激发他们对数学、逻辑、科学的兴趣。
另外,百钱百鸡问题也可以引导学生进行讨论和合作。
在解决问题的过程中,学生可以分小组进行讨论和合作,共同思考问题的解决方案,锻炼他们的合作能力和团队精神。
通过这样的合作讨论,可以增强学生对问题的深入理解,培养他们的团队合作精神,激发他们的创新思维。
通过百钱百鸡问题的教学,可以让学生在启发式的学习中获得知识和能力的提升。
同时也可以让学生在实践中体验到数学的美妙和应用的奇妙,激发他们对数学学科的兴趣和热爱。
在这个过程中,学生不仅仅是在解决一个数学问题,更是在培养自己的各种能力,提升自己的综合素质。
总之,百钱百鸡问题是一个既有趣又有益的数学问题,它可以成为课程思政中的一个很好的案例。
通过这个问题,可以引导学生进行数学思维和逻辑思维的训练,培养他们的实践运用能力和创新精神,激发他们对数学学科的热爱和兴趣。
百钱百鸡问题
百鸡问题
公元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万次相比,仅为原来的万分之七,有重大改进。
百钱买百鸡实验报告
一、题目描述我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?二、解题思路对n=100的情况,因为有三个变量,则有三重循环和二重循环两种算法1、算法一:三重循环(1)变量变化范围的确定:由于公鸡5钱一只,则100钱最多可购买100/5=20只公鸡,此即为第一个变量的变化上限;由于母鸡3钱一只,则100钱最多可购买100/3≈33只母鸡,此即为第二个变量的变化上限;由于小鸡三只一钱,而所有鸡的总数不得超过100只,则100即为第三个变量的变化上限;(2)条件的控制:由百钱买百鸡可知,鸡的数量为100只,买鸡所用的钱数为100钱,即控制条件为a+b+c=100且a*5+b*3+c/3=100;2、二重循环:(1)变量变化范围的确定:由于整题共有3个变量,所以当前两个变量确定后,第三个变量自然被确定下来,故可采用二重循环解题。
前两个变量的确定同三重循环,第三个变量则用c=n-a-b来确定;(2)条件的控制:由百钱买百鸡可知,鸡的数量为100只,买鸡所用的钱数为100钱,即控制条件为a+b+c=100且a*5+b*3+c/3=100;由于需要讨论算法的时间性能,在程序中加入时间函数计算程序运行所需的时间进行比较。
用控制变量的方法,对两种算法中的n进行同样的变化处理,来讨论两种算法的时间性能,e.g.分别令n=100,n=200,n=500,n=1000,n=2000,n=5000三、自我评估、反思由于较长时间未使用C语言编程,所以在使用语法上略显生疏了些,通过这次作业的实践过程,对C语言的编程语法规则熟悉了许多,虽然在运行过程中出现了一些错误,但也都能够较快地解决,第一次的数据结构实验作业总体完成的还算比较顺利。
百鸡问题答案
百鸡问题答案【篇一:百鸡问题】,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。
凡百钱买鸡百只,问鸡翁、母、鶵各几何?答曰:鸡翁四,值钱二十;鸡母十八,值钱五十四;鸡鶵七十八,值钱二十六。
又答:鸡翁八,值钱四十;鸡母十一,值钱三十三,鸡鶵八十一,值钱二十七。
又答:鸡翁十二,值钱六十;鸡母四、值钱十二;鸡鶵八十四,值钱二十八。
”原书说明这个问题流传很广,解法很多,但从现代数学观点来看,实际上是一个求不定方程整数解的问题。
解法如下:设公鸡、母鸡、小鸡分别为x、y、z 只,由题意得:①……x+y+z =100②……5x+3y+(1/3)z =100x =12;y =4;z =84c语言解法#include stdio.hvoid main(){int cocks=0,hens,chicks;while(cocks=20){: k s; q# s1 m4 nhens=0;while(hens=33){( e2 n/ \) `9 t% e* f( r6 xchicks=100-cocks-hens;if(5.0*cocks+3.0*hens+chicks/3.0==100.0)1 t0 g4 {+ e c: h9 n/a8 y printf(公鸡%d只,母鸡%d只,小鸡%d只\n\n,cocks,hens,chicks); hens++;}cocks++;}}输出结果为:公鸡0只,母鸡25只,小鸡75只公鸡4只,母鸡18只,小鸡78只公鸡8只,母鸡11只,小鸡81只公鸡12只,母鸡4只,小鸡84只java语言解法public class baijiwenti4 c. m0 i k! }/ m/ n z{0 t4 j8 f0 q n: j: z4 b; ipublic static void main (string [] args)+ b6 t s2 i/ e c: c{for (int x = 0; x = 19; x++){2 z) l8 q% x% @( s$ sfor (int y = 0; y = 33; y++)7 h6 r5 ^ w# t9 l{, b7 d4 q7 `) z2 k i% n7 [int z = 100 - x - y;if((x * 5 + y * 3 + z / 3 == 100 ) z % 3 == 0){# h1 q. t( j/ s y/ r, ssystem.out.println(可买鸡翁只数: + x);system.out.println(可买鸡母只数: + y);system.out.println(可买鸡雏只数: + z);/ r8 f+ ? b4 ? q4 | r}/ c$ u/ w7 k8 {+ h7 d}}}}【篇二:著名数学难题赏析-百钱百鸡】p class=txt>数学教研组(共两课时120分钟)我国古代数学书《张邱建算经》中有如下问题,也就是著名的百鸡百钱问题。
算法经典问题系列1百钱买百鸡问题
算法经典问题系列1 百钱买百鸡问题一说起唐朝,人们就会情不自禁地想起诗歌,绝对没有人会提到数学在数学上,虽说唐代并没有产生与其前的魏晋南北朝或其后的宋元相媲美的大师,却在数学教育制度的确立和数学典籍的整理方面有所建树.长达近三百年的唐代在数学方面最有意义的事情莫过于《算经十书》的整理和出版,这是高宗李治下令编撰的。
除了《周牌算经》《九章算术》《海岛算经》和《缀术》以外,《算经十书》中至少还有三部值得一提,分别是《孙子算经》《张丘建算经》和《缉古算经》'这三部书的共同特点是,每一部都提出了一个非常有价值的问题,并以此传世。
《张丘建算经》成书于公元5世纪,作者是北魏人.书中最后一道题堪称亮点,通常也被称为"百钱买百鸡"问题,民间则流传着县令考问神童的佳话书中原文如下:今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买鸡百只,问鸡翁、母、雏各几何?题目的意思是,公鸡5文钱1只,母鸡3文钱1只,小鸡1文钱买3只,现在用100文钱共买了100只鸡,问:在这100只鸡中,公鸡、母鸡和小鸡各是多少只?(设每种至少一只)算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。
枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。
能使命题成立者,即为问题的解。
1.采用枚举算法解题的基本思路:2.确定枚举对象、枚举范围和判定条件;3.一一枚举可能的解,验证是否是问题的解下面是解这个百鸡问题的程序var x,y,z:integer;begin for x:=1 to 100 do for y:=1 to 100 do for z:=1 to 100 do if(x+y+z=100)and(x*5+y*3+z/3=100)then writeln('x=',x,'y=',y,'z=',z);{验证可能的解,并输出符合题目要求的解}end.这个算法学生容易想到,而重复是计算机的拿手好戏,算法可读性好。
百钱百鸡问题的课程思政
百钱百鸡问题的课程思政百钱百鸡问题是一个经典的数学问题,也是一个生活中常见的实际问题。
它是一个启发思考的问题,通过解决这个问题,可以培养学生的逻辑思维能力和实际问题解决能力,同时也能从中引发对社会分配公平性的思考。
在课程思政中,我们可以通过讨论百钱百鸡问题,引导学生思考社会的公平性和资源分配的合理性等问题。
下面我们来详细探讨一下。
首先,百钱百鸡问题是一个关于资源分配的问题。
问题中要求用100枚铜钱购买100只鸡,母鸡5枚钱一只,公鸡3枚钱一只,小鸡1枚钱三只。
这个问题实际上暗含了资源的合理利用、优化分配的思维方式。
在具体解题过程中,学生需要通过巧妙的分析和计算,找到一种最优的资源分配方案,使得100元钱既购买了100只鸡,又最大程度上发挥了资源的利用效益。
从而,课后可延伸提问学生们可以探索百钱买100只兔子的问题,或放宽限制提高一些的情况下会有怎样的变化。
这样呢,就能够引导学生思考资源分配的公平性和效率性问题,激发他们在未来面临类似问题时的分析和解决能力。
另外,百钱百鸡问题也可以引发学生对社会公平性的思考。
在问题中,母鸡、公鸡和小鸡的价格不同,这涉及到物价和资源分配的问题。
对于学生来说,通过解决这个问题不仅可以锻炼他们的数学运算能力,还可以引导他们思考社会资源的分配是否存在公平性问题。
他们可以思考,为什么母鸡的价格比公鸡贵呢?为什么小鸡的价格比母鸡还低呢?这背后是否存在某种具体的原因或者规律?这样一来,不仅能加深学生对数学知识的理解,还可以拓展他们的思维广度,使他们在思考社会问题时更加全面和综合。
最后,百钱百鸡问题还可以启发学生对资源利用的节约性思考。
在问题中,我们要通过合理的购买方式,最大限度地利用有限的资金购买最多的鸡。
这就要求学生具备节约资源的意识和能力。
我们可以引导学生思考,如果不计成本,购买100只鸡的方式会发生怎样的变化?如果同时考虑成本和效益,应该如何制定购买计划?通过这样的探讨,可以培养学生的节约意识和资源管理能力,让他们在日常生活中更加注重资源的合理利用。
百钱买百鸡的c 语言项目介绍及总结
百钱买百鸡的c 语言项目介绍及总结百钱买百鸡是一个经典的数学问题,也是一个有趣的编程题目。
在这个问题中,我们需要找到一种方案使得用一百枚钱购买一百只鸡,其中公鸡每只五块钱,母鸡每只三块钱,小鸡三只一块钱。
这个问题的解决思路是用三个循环去遍历所有可能的组合,然后判断是否成立。
具体来说,我们可以用三个循环来表示公鸡、母鸡和小鸡的数量,然后计算总金额是否等于一百,并且总数量是否等于一百。
如果满足这两个条件,那么就找到了一个符合要求的方案。
以下是一个用C语言实现百钱买百鸡问题的代码示例:```C#include <stdio.h>int main() {int x, y, z; //公鸡、母鸡、小鸡的数量int count = 0; //方案计数//使用三个循环遍历所有可能的组合for (x = 0; x <= 20; x++) {for (y = 0; y <= 33; y++) {z = 100 - x - y; //计算小鸡数量//判断总金额是否等于一百,并且总数量是否等于一百if (5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {count++;//输出符合要求的方案printf("方案%d:公鸡%d只,母鸡%d只,小鸡%d只\n", count, x, y, z);}}}return 0;}```运行上述代码,我们可以得到所有满足条件的百钱买百鸡方案。
例如,其中一个方案是:公鸡4只,母鸡18只,小鸡78只。
在这个问题中,我们通过用循环遍历所有可能的组合,然后判断是否满足条件,找到了所有符合要求的方案。
这个问题的解法通过编程的方式展现了数学的魅力,同时也锻炼了编程思维和逻辑思维。
总结起来,百钱买百鸡是一个经典的数学问题,通过编程解决这个问题可以帮助我们巩固和运用数学知识,并且提高编程的能力。
编程能够让我们更好地理解问题,并且通过编写代码来解决问题,在这个过程中不断调试和优化,提高自己的编码能力。
第一部分:趣味算法入门第一题:百钱买百鸡
第⼀部分:趣味算法⼊门第⼀题:百钱买百鸡100个不同类型的python语⾔趣味编程题在求解的过程中培养编程兴趣,拓展编程思维,提⾼编程能⼒。
第⼀部分:趣味算法⼊门;第⼀题'''1.百钱买百鸡:中国古代数学家张丘建在他的《算经》中提出了⼀个著名的 “ 百钱百鸡问题 “:⼀只公鸡值五钱,⼀只母鸡值三钱,三只⼩鸡值⼀钱,现在要⽤百钱买百鸡,请问公鸡、母鸡、⼩鸡各多少只?'''#答案⽰例如下;import time #导⼊time模块,以⽤来计算程序运⾏的时间,可忽视time.perf_counter() #与time模块中计算时间有关,可忽视#主体代码块如下:for cock in range(0,20):for hen in range(0,33-cock):chicken=100-cock-henif chicken%3==0:if 5 * cock + 3 * hen + chicken / 3 == 100:print('公鸡{}只,母鸡{}只,⼩鸡{}只'.format(cock,hen,chicken))print(time.perf_counter()) #打印出程序运⾏的时间,可忽视#解本问题有多种⽅法,我只写了⼀种⽅法,读者可以⾃⼰尝试各种⽅法,再⽤time模块计算每种⽅法的运⾏时间。
补充:算法是解决特定问题的⽅法,是程序设计的基础,是程序设计的灵魂。
作为⼀个算法,应具备5个特性,即有穷性、确定性、可⾏性、输⼊和输出。
计算机算法可分为两⼤类,分别是数值计算算法和⾮数值计算算法,数值计算的⽬的是求解数值,例如求⽅程的根;⾮数值计算算法主要⽤于处理事务领域的问题,如排序、查找等。
问题分析:⽤百钱如果只买公鸡,最多可以买20只,但题⽬要求买⼀百只,由此可知,所买公鸡的数量肯定在0-20之间,同理,母鸡的数量在0~33之间在。
此把公鸡、母鸡和⼩鸡的数量分别设为cock、hen、chicken, 则cock+hen+chicken=100,因此百钱买百鸡问题就转化成解不定⽅程组cock + hen + chicken == 100和5 x cock + 3 x hen +chicken/3=100的问题了。
百鸡百钱问题及其算法分析
资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载百鸡百钱问题及其算法分析地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容百钱百鸡问题的最佳解决方案(陕西师范大学计算机科学学院10级计科一班西安 710062)摘要:本文主要讨论百鸡百钱问题,通常用蛮力法策略,用枚举法表现,排除明显不合理情况,列举出符合问题的解,分别验证解的可行性,得到最优算法。
关键词:蛮力法;枚举;百鸡百钱;The money the chicken question the best solutionduan xi-juan, zhongmei, zhao shan-shan, zhao ya-wen(School of Computer Science, ,Shanxi Normol University, Xi’an 710062)Abstact :In this article, we mainly discuss the chicken and the money problem. Usually use brute force method strategy, with enumeration method performance, eliminate obviously unreasonable situation, Enumerate conform to the problem solution, which verified the feasibility of the solution, and get the optimal algorithm.Keywords: The brute force method;Enumeration;Hundred chickens money1引言在求解一个较小规模的问题时,可以根据问题中的约束条件把可能的情况一一列举出来,然后注意尝试从中找到满足约束条件的解,若该问题规模较大,符合条件的情况很多,则需要进一步考虑,排除一些明显不合理的情况,尽可能减少问题可能解的列举数目。
【枚举法】百钱百鸡2
【枚举法】百钱百鸡2题⽬描述中国数学家张邱建(公元五世纪,其它资料不详),在他的《算经》中提出了著名的“百钱买百鸡”问题:鸡翁⼀,值钱五,鸡母⼀,值钱三,鸡雏三,值钱⼀。
百钱买百鸡,问翁、母、雏各⼏何?你的任务是:根据给定的钱数m,和买到的鸡数n,输出所有的⽅案。
如果没有可⾏⽅案,输出None。
输⼊格式只有两个整数m、n(0<m,n<10000) 。
表⽰买鸡⽤的总钱数和总只数。
输出格式若⼲⾏,每⾏3个数,表⽰⼀种可⾏⽅案,分别表⽰鸡翁、鸡母、鸡雏的数量。
样例输⼊1100 100样例输出10 25 754 18 788 11 8112 4 84问题提⽰所有⽅案,第⼀优先级按公鸡的数量从⼩到⼤排列。
思路分析枚举法的⼀些套路,确定以下内容:枚举对象。
有⼏个来⼏重循环枚举范围。
判断条件。
根据题⾯信息,三个未知的枚举对象:公鸡、母鸡和⼩鸡。
鸡的数量最多n只。
需要满⾜两个条件总数为n总的价格为m第⼀版框架for(int i=0;i<=n;i++){//枚举公鸡的可能数量for(int j=0;j<=n;j++){//枚举母鸡的可能数量for(int k=0;k<=n;k++){//枚举⼩鸡的可能数量if(k%3==0&&(i+j+k==n)&&(5*i+3*j+k/3==m)){//数量和钱满⾜要求}}}}分析复杂度三重循环O(n3)的复杂度。
该题⽬范围,显然会超时。
需要进⼀步优化。
对于枚举法优化的⼏个思考⽅向:减少枚举对象剪枝hash代替判断根据数量关系,三种鸡加起来总共n只,那么当已经确定公鸡i,母鸡j时,⼩鸡的数量可等于n−i−j不⽤再循环枚举了。
这样就减少了⼀重循环。
再根据钱的总价为m,那么公鸡最多就是买m5只,母鸡最多就是买m3只,不需要枚举到n,减少⾮必要的枚举。
第⼆版框架for(int i=0;i<=m/5;i++){//枚举公鸡的可能数量 for(int j=0;j<=m/3;j++){//枚举母鸡的可能数量Processing math: 100%int k=n-i-j;//计算⼩鸡的数量if(k%3==0&&(5*i+3*j+k/3==m)){//钱满⾜要求}}}}实现代码#include <iostream>#include <cstdio>using namespace std;int main(){int m,n;bool flag=false;cin>>m>>n;for(int i=0;i<=m/5;i++){//枚举公鸡的数量for(int j=0;j<=m/3-i;j++){//枚举母鸡数量int k=n-i-j;//计算⼩鸡的数量if(k<0) break;//⼩鸡数量⼩于0 不符合要求if(k%3==0&&5*i+3*j+k/3==m){//看钱的总数是否是m flag=true;//标记有存在⽅案cout<<i<<" "<<j<<" "<<k<<endl;}}}if(!flag){//没有组合输出Nonecout<<"None";}return 0;}。
“百鸡问题”的简单解法
“百鸡问题”的简单解法“今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。
凡百钱买鸡百只。
问鸡翁母雏各几何?”翻译过来是: 1只公鸡值 5 文钱,1只母鸡值3文钱,3只小鸡才值1文钱。
现在用100文钱买100只鸡,问公鸡、母鸡、小鸡各有多少只?这就是我国古代数学名著《张丘建算经》里的一个题目,也被称为有趣的“百鸡问题”。
谈到“百鸡问题”,就要说一说我国古代数学家张丘建小时候的故事。
“相传在南北朝时期(公元 386 年——公元 589 年),我国北方出了一个“神童”,他反映敏捷,计算能力超群,许多连大人一时也难以解答的问题,他一下子就给算出来了。
远近的人都喜欢找他计算数学问题。
“神童”的名气越来越大,传到当时宰相的耳中。
有一天,宰相为了弄清“神童”是真是假,特地把“神童”的父亲叫了去,给了他 100 文钱,让第二天带 100 只鸡来。
并规定 100 只鸡中公鸡、母鸡和小鸡都要有,而且不准多,也不准少,一定要刚好百钱百鸡。
当时,买 1 只公鸡 5 文钱,买 1 只母鸡 3 文钱,买 3 只小鸡才 1 文钱。
怎样才能凑成百钱百鸡呢?“神童”想了一会,告诉父亲说,只要送 4 只公鸡、 18 只母鸡和 78 只小鸡就行了。
第二天,宰相见到送来的鸡正好满足百钱百鸡,大为惊奇。
他想了一下,又给了 100 文钱,让明天再送 100 只鸡来,还规定不准只有 4 只公鸡。
这个问题也没有难住“神童”。
他想了一会,叫父亲送 8 只公鸡、 11 只母鸡和 81 只小鸡去。
还告诉父亲说,遇到类似问题,只要怎样怎样就行了。
第二天,宰相见到了送来的 100 只鸡,赞叹不已。
他又给了 100 文钱,要求下次再送 100 只鸡来。
岂料才一会儿,“神童”的父亲就送来了 100 只鸡。
宰相一数:公鸡 12 只、母鸡 4 只、小鸡 84 只,正好又满足百钱百鸡。
”这个“神童”就是张丘建,后来经过自己的勤奋学习,成为一个著名的数学家。
那么张丘建是怎样算出这三种结果的呢?此题用“鸡兔同笼”的假设法,确实有些复杂,但也能解得出。
JAVA编程-百钱买百鸡详解
题目:我国古代数学家张丘建成在《算经》中出了一道"百钱买百鸡"的问题,题意是:五文钱可以买一只公鸡,3文钱可以买一只母鸡,1文钱可以买3只雏鸡,现在用100文钱买一百只鸡,那么各有公鸡、母鸡、雏鸡多少只?思路分析1:百钱买百鸡问题,公鸡五文钱1只,母鸡3文钱一只,小鸡1文钱3只,问100元买100只鸡, 各有公鸡、母鸡、雏鸡多少只?假设买公鸡x 只,买母鸡y 只,买小鸡z 只,那么根据已知条件列方程,得出:(1)、 x+y+z=100 //计算鸡的数量,公鸡x+母鸡y+小鸡z =100只鸡(2)、 5x+3y+Z 3 =100 或者写成 5x+3y+13z=100 //计算100元能买多少只鸡 说明:根据题意小鸡1文钱3只,表达式中13 z 也就是Z 3,只是写法不同,都是表示一只鸡要多少钱?(3)、 z=100-x-y //计算小鸡的数量把以上3个公式整理后得到:5x+3y+100-x-y 3=100 然后整个公式都乘以3后: 3×5x+3×3y+3×100-x-y 3=100×3 计算后得到: 15x+9y+100-x-y=300把左边式子整理得到: 15x-x +9y -y +100 =300把左边式子X 和Y 减去得到: 14x+8y+100=300把左边整数放右边,整理得到: 14x+8y=300-100计算后得到: 14x+8y=200继续整理公式,都除以2后:14x 2 +8y 2 =2002计算后得到: 7x+4y=100根据上面公式得到y 整理得到:4y=100-7x然后整个公式都除以4后: 4y 4 = 100-7x 4整理得到y(母鸡数量)的公式:y = 100-7x 4;从右边式中看出4和100都是4的倍数: 这样拆分写是为了让读者通俗易懂: y =1004 - 7x 4 整理公式得到: y =25-74 x 也可以写成 y =25-7x 4由于y 是表示母鸡数量,它一定是自然数(自然数是整数(自然数包括正整数和零),但整数不全是自然数,例如:-1 -2 -3......是整数 而不是自然数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
百钱百鸡问题的最佳解决方案
(陕西师范大学计算机科学学院10级计科一班西安 710062)
摘要:本文主要讨论百鸡百钱问题,通常用蛮力法策略,用枚举法表现,排除明显不合理情况,列举出符合问题的解,分别验证解的可行性,得到最优算法。
关键词:蛮力法;枚举;百鸡百钱;
The money the chicken question the best solution
duan xi-juan, zhongmei, zhao shan-shan, zhao ya-wen
(School of Computer Science, ,Shanxi Normol University, Xi’an 710062)
Abstact :In this article, we mainly discuss the chicken and the money problem. Usually use brute force method strategy, with enumeration method performance, eliminate obviously unreasonable situation, Enumerate conform to the problem solution, which verified the feasibility of the solution, and get the optimal algorithm.
Keywords: The brute force method;Enumeration;Hundred chickens money
1引言
在求解一个较小规模的问题时,可以根据问题中的约束条件把可能的情况一一列举出来,然后注意尝试从中找到满足约束条件的解,若该问题规模较大,符合条件的情况很多,则需要进一步考虑,排除一些明显不合理的情况,尽可能减少问题可能解的列举数目。
2问题描述
百钱百鸡问题。
中国古代数学家张丘建在他的《算经》中提出了他的著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?
3算法设计
根据问题中的约束条件将可能的情况一一列举出来,但如果情况很多,排除一些明显的不会理的情况,尽可能减少问题可能解的列举数目,然后找出满足问题条件的解。
1)算法设计一
首先问题有三种不同的鸡,那么我们可以设鸡翁为x只,鸡母为y只,鸡雏为z只。
由题意给出一共要用100钱买一百只鸡,如果我们全部买鸡翁最多可以买100/5=20只,显然x的取值范围是1~20之间;如果全部买鸡母最多可以买100/3=33只,显然y的取值范围在1~33之间;如果全部买鸡雏最多可以买100×3﹦300只,可是题目规定是买100只,
所以z 的取值范围是1~100.那么约束条件为:x +y +z =100且5×x +3×y+100/3=100. 流程图如下:
算法1程序运行结果截图:
开始
定义x.y,z x<=20? y<=33? z<=99? 百鸡百钱? 结束 N
输出结果 N N N Y Y Y Y
2)算法设计二
假如我设了鸡翁和鸡母的个数为x和y了,那么鸡翁和鸡母的数量就是确定的,那么鸡雏的数量就是固定的为100﹣x﹣y,那么此时就不再需要进行枚举了,约束条件就只有一个了:5×x+3×y+z/3=100.
流程图如下所示:
结束
图5-9 程序执行流程图
算法2程序运行结果截图:
4算法分析
算法设计一需要枚举尝试24276343421=⨯⨯次,算法的效率显然很低。
算法设计二只须枚举尝试7143421=⨯次。
实现时约束条件又限定z 能被3整除时,才会判断“5x+3y+z/3=100⨯⨯”。
这样省去了z 不整除3时的算术计算和条件判断,进一步提高了算法的效率。
5结束语
有此例可以看出,枚举法是蛮力策略的一种变现形式,也是一种使用非常普遍的思维方法。
然而对于同一个问题,可以有不同的枚举范围,不同的枚举对象,解决问题的效率差别就会很大,选择合适的方法会让解决问题的效率大大提高。
6参考文献
[1]吕国英 算法设计与分析(第二版)[M].北京:清华大学出版社,2009.
[2]朱清新 计算机算法分析导论[M].北京:人民邮电大学出版社
[3]谭浩强 C 语言程序设计(第三版) 清华大学出版社。