百鸡百钱问题及其算法分析

合集下载

算法-经典趣题-百钱买百鸡

算法-经典趣题-百钱买百鸡

算法-经典趣题-百钱买百鸡本⽂为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只问一百只鸡中公鸡母鸡小鸡各多少?这是一个古典数学问题设一百只鸡中公鸡母鸡小鸡分别为xyz问题化为三元一次方程组
例 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语言的编程语法规则熟悉了许多,虽然在运行过程中出现了一些错误,但也都能够较快地解决,第一次的数据结构实验作业总体完成的还算比较顺利。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 语言程序设计(第三版) 清华大学出版社。

相关文档
最新文档