文档库 最新最全的文档下载
当前位置:文档库 › 百鸡百钱问题及其算法分析

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

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

百钱百鸡问题的最佳解决方案

(陕西师范大学计算机科学学院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 语言程序设计(第三版) 清华大学出版社

PYTHON中百钱买百鸡问题

PYTHON中百钱买百鸡问题 问题: 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,问翁、母、雏各几何?在PYTHON中编程实现将所有可能的方案输出。 问题分析: 根据题意设公鸡、母鸡和雏鸡分别为cock,hen和biddy,如果100钱全买公鸡,那么最多能买20只,所以cock的范围是大小等于0小于等于20;如果全买母鸡那么最多能买33只,所以hen的范围是大于等于0小于等于33;如果100钱全买小鸡,那么根据题意最多能买99只(小鸡的数量应小于100且是3的倍数)。在确定了各种鸡的范围后进行穷举并判断,判断的条件有以下3种:(1)、所买的三种鸡的钱数总和为100; (2)、所买的三种鸡的数量之和为100; (3)、所买的小鸡的数量必须是3的倍数。 程序代码: for cock in range(0,20+1): #鸡翁范围在0到20之间 for hen in range(0,33+1): #鸡母范围在0到33之间 for biddy in range(3,99+1): #鸡雏范围在3到99之间 if (5*cock+3*hen+biddy/3)==100:#判断钱数是否等于100 if (cock+hen+biddy)==100: #判断购买的鸡数是否等于100 if biddy%3==0: #判断鸡雏数是否能被3整除 print ("鸡翁:",cock,"鸡母:",hen,"鸡雏:",biddy) #输出程序运行结果: 鸡翁: 0 鸡母: 25 鸡雏: 75 鸡翁: 4 鸡母: 18 鸡雏: 78 鸡翁: 8 鸡母: 11 鸡雏: 81 鸡翁: 12 鸡母: 4 鸡雏: 84

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

百钱百鸡问题的最佳解决方案 (陕西师范大学计算机科学学院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只,显然

百鸡百钱问题实验报告

蛮力法之百鸡百钱问题 摘要: 本次报告主要讨论百鸡百钱问题,通常使用蛮力法策略,用枚举法来表现,列举出满足问题条件的解,排除一些明显不合理情况,分别验证解的可行性,得到最优算法。 关键词:蛮力法;枚举法;百鸡百钱; Hundred chickens money Abstract: This paper reports hundred chickens money, u sually using a brute force method strategy, use enumeration method to the performance, meet the conditions listed problem solution, exclude some obvious unreasonablesituation, respectively, to verify the feasibility of the solution, optimal algorithm. Key words: the brute force method; enumeration; hundred chickens money; 1 引言 在求解一个较小规模的问题时,可以根据问题中的约束条件把可能的情况一一列举出来,然后注意尝试从中找到满足约束条件的解,若该问题规模较大,符合条件的情况很多,则需要进一步考虑,排除一些明显不合理的情况,尽可能减少问题可能解的列举数目。 2 问题概述 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁,母,雏各几何? 译为;现一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱;给你一百元钱去买公鸡、母鸡、小鸡共一百只,问你应当买多少只公鸡?多少只母鸡?多少只小鸡? 通过对问题的理解,可列出两个三元一次方程,去解这个不定解方程,找出存在的解。我们要用到“懒惰”的蛮力法其实就和这类似,不同的是我们只需要加以条件,让电脑帮助我们计算,解出结果。 3算法设计 在公鸡(x),母鸡(y)数量确定后,根据总数100只,小鸡的数量z也就确定为:z=100-x-y,无需再对小鸡的数量进行枚举,此时的约束条件:5x+3y+z/3=100 且小鸡的数量是3的倍数,这样只需枚举20*34=660次。 int main() {int x,y,z; for(x=0;x<20;x++) for(y=0;y<33;y++) { z=100-x-y; if(z%3==0 && 5*x+3*y+z/3==100) { printf("公鸡=%d 母鸡=%d 小鸡=%d\n",x,y,z); } }

著名数学难题赏析-百钱百鸡

------著名数学难题赏析: 百鸡百钱 数学教研组 (共两课时120分钟) 我国古代数学书《张邱建算经》中有如下问题,也就是著名的百鸡百钱问题。大意是:公鸡1只值钱5,母鸡1只值钱3,小鸡3只值钱1。今有钱100,买鸡100只。问公鸡、母鸡、小鸡各买几只? 关于这个“百鸡百钱问题”还流传着下面一个故事哩! 在我国南北朝的时候,京城里有个卖鸡的张老老,所生一子,天资聪颖,勤学不怠。到十二三岁,已经博览群书,尤其富有算术的天才。邻居每遇疑难问题,或是钱银上发生纠纷,都由他一言解决。因此大家都叫他张神童,逐渐传扬开去,不久就远近闻名了。当朝的老丞相爱才若渴,一天,听人谈到张神童的算法,心中很是不信,当下想了一个方法要去试探他,于是唤他的仆人去打听张老老卖的鸡是什么价钱。不多时仆人回答说:“公鸡每只卖钱五文,母鸡每只卖钱三文,小鸡每三只卖钱一文。”老丞相就拿出一百文钱,命仆人去给张老老,叫他尽这一百文钱把三种鸡配成一百只,不多不少,明天送来。张老老暗想:这实在是一个难题,然而又不敢违命,当时只好一口答应。等到收市后,就开始把三种鸡配起来。但是左配右配,总是配不成。正在无计可施的时候,他的儿子来了,问起情由,才知道是这样的一件事。于是安慰着父亲,叫他不要着急,明天总有办法。张神童当晚经过仔细研究,果然找到了答案。第二天选出了“公鸡4只,母鸡18只,小鸡78只”叫他父亲送到相府。老丞相拿来一算:4只公鸡值钱二十文,18只母鸡值钱五十四文,78只小鸡值钱二十六文,共计100只鸡,恰巧值钱一百文。心里一高兴,立刻又拿一百文钱给张老老,叫他明天再送一百只鸡来,不过三种鸡的只数要换一种方法搭配。张老老口头答应着,心里很是担忧,垂头丧气地回到家,忙和儿子商量。儿子说:“你明天拿8只公鸡,11只母鸡,81只小鸡送去就是了。”第二天张老老依言送去,老丞相一算,又是一点不错。心里一高兴,又给张老老一百文钱,要再另配一百只鸡。张老老暗想:这回恐怕是无法应付了。不料他的儿子又检出“公鸡12只,母鸡4只,小鸡84只”叫父亲送

百钱买百鸡问题

百钱买百鸡问题 例9-8 百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。 这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x ,y ,z ,问题化为三元一次方程组: ? ? ?=++=++)(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 的取值范围为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的细化 4.1 z =1 4.2 是否满足百钱,百鸡 4.2.1 满足,输出最终百钱买到的百鸡的结果 4.2.2 不满足,不做处理 4.3 变量增加,这里注意步长为3 流程图

图5-8 程序执行流程图 程序代码如下 #include "stdio.h" main() { int x,y,z; for(x=1;x<=20;x++) { for(y=1;y<=33;y++) { for(z=3;z<=99;z+=3) { if((5*x+3*y+z/3==100)&&(x+y+z==100))/*是否满足百钱和百鸡的条件*/ printf("cock=%d,hen=%d,chicken=%d\n",x,y,z); } } } } 分析

c语言百钱买百鸡问题

百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。 这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x ,y ,z ,问题化为三元一次方程组: ? ? ?=++=++)(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 的取值范围为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的细化 4.1 z =1 4.2 是否满足百钱,百鸡 4.2.1 满足,输出最终百钱买到的百鸡的结果 4.2.2 不满足,不做处理 4.3 变量增加,这里注意步长为3 流程图

图5-8 程序执行流程图 程序代码如下 #include "stdio.h" main() { int x,y,z; for(x=1;x<=20;x++) for(y=1;y<=33;y++) for(z=3;z<=99;z+=3) { if((5*x+3*y+z/3==100)&&(x+y+z==100))/*是否满足百钱和百鸡的条件*/ printf("cock=%d,hen=%d,chicken=%d\n",x,y,z); } } 分析 程序运行结果如下: cock=4,hen=8,chicken=78 cock=8,hen=11,chicken=81 cock=12,hen=4,chicken=84

多种解法求百钱百鸡问题

学号: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算法设计1 4.1.1数据要求 问题中的常量: 无

java程序”百钱买百鸡“

尝试分别用三层循环、两层循环、一层循环编程实现“百钱买百鸡”问题。母鸡5分钱一只,公鸡三分钱一只,小鸡一分钱三只,现在有百钱欲买百鸡,有多少种买法? 三层循环 //百钱买百鸡-三层循环 //母鸡5分钱一只,公鸡三分钱一只,小鸡一分钱三只 //母鸡m只,公鸡n只,小鸡k只 public class BaiQianMaiBaiJi3 { public static void main(String[] args) { int m,n,k,i=0; for(m=0;m<=20;m++) for(n=0;n<=33;n++) for(k=0;k<=300;k+=3) if(5*m+3*n+k/3==100&&m+n+k==100) i++; System.out.println("百钱买百鸡共有 "+i+" 种方法"); } } 两层循环 //百钱买百鸡-两层循环 //母鸡5分钱一只,公鸡三分钱一只,小鸡一分钱三只 //母鸡m只,公鸡n只 public class BaiQianMaiBaiJi2 { public static void main(String[] args) { int m,n,i=0; for(m=0;m<=20;m++) for(n=0;n<=33;n++) if(5*m+3*n<=100&&m+n+(100-5*m-3*n)*3==100) i++; System.out.println("百钱买百鸡共有 "+i+" 种方法"); } } 一层循环 //百钱买百鸡-一层循环 //母鸡5分钱一只,公鸡三分钱一只,小鸡一分钱三只

//母鸡m只,公鸡n只,小鸡k只 4m+2n=2(k/3);m+n+k=100 public class BaiQianMaiBaiJi1 { public static void main(String[] args) { int m,i=0; for(m=0;m<=20;m++) { if((100-7*m)>0&&(100-7*m)%4==0)//&&k=3(100+m)/4,(100+m)%4==0 i++; } System.out.print("百钱买百鸡共有 "+i+" 种方法"); } }

百钱百鸡问题

百钱百鸡问题 我国古代数学家张丘建在《算经》中提出了著名的“百钱百鸡问题”:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?”意思是说:一只公鸡卖5枚钱,一只母鸡卖3枚钱,三只小鸡卖1枚钱,用100枚钱买100只鸡,能买到公鸡、母鸡、小鸡各多少只? 分析: ① 这是一个不定方程问题。有3个未知数,2个方程:设公鸡、母鸡、小鸡数分别为i、j、k,则有i+j+k=100,i*5+j*3+k/3=100。需要让计算机去一一测试是否符合条件,找出所有可能的答案。由于价格的限制,如果只是一种鸡,则公鸡最多为19只(由于共100只鸡的限制,不能等于20只),母鸡最多33只,小鸡最多99只。 ② 这里用到的是穷举算法。穷举算法的基本思想是:对问题的所有可能答案一一测试,直到找到正确答案或测试完全部可能的答案。 程序如下: main( ) { int i,j,k; for(i=1;i<=19;i++) for(j=1;j<=33;j++) for(k=3;k<=99;k=k+3) { if((i+j+k==100)&&(i*5+j*3+k/3==100)) printf("i=%d,j=%d,k=%d\n",i,j,k); } } 运行结果为: i=4,j=18,k=78 i=8,j=11,k=81 i=12,j=4,k=84 #include void main() { int x,y,z,j=0; printf("Folleing are possible plans to buy 100 fowls with 100 Yuan.\\n"); for(x=0;x<=20;x++) /*外层循环控制鸡翁数*/ for(y=0;y<=33;y++) /*内层循环控制鸡母数y在0~33变化*/ { z=100-x-y; /*内外层循环控制下,鸡雏数z的值受x,y的值的制约*/ if(z%3==0&&5*x+3*y+z/3==100)

鸡解剖实验报告.doc

实验报告 一、实验名称:鸡的解剖 二、试验时间:2012年12月12日 三、实验地点:动医楼 四、使用器械:镊子(不带齿)、手术刀、手术剪 五、解剖程序:首先把鸡处死,方法是:在鸡的颈部靠近头处开口 放血致死;然后解剖 六、观察内容 1.嗉囊:食管的膨大部,位于叉骨之前,直接在皮下,偏右 2.腺胃:纺锤形,在肝左右两叶之间的背侧 3.肌胃:紧接与腺胃,近圆形,呈暗红色 4.十二指肠:位于腹腔右侧,前端与肌胃相接,灰白色,管状 5.空肠:前接十二指肠,后接回肠,灰白色,管状 6.回肠:前接空肠,后接结直肠,夹在两条盲肠之间,灰白色,管 状 7.结直肠:很短,前接回肠 8.胰腺:夹在十二指肠降升支之间,淡黄色,长条形 9.肝:位于腹腔前下部,暗褐色,分左右两叶,右叶有一绿色胆囊 10.法氏囊:位于鸡的泄殖腔的背侧,是泄殖腔的一个盲囊 11.气管:较长而粗,半透明管状,位于皮下,偏右,进入胸腔在心 基上方分为两个支气管 12.鸣管:位于气管与支气管交叉处,分外鸣膜和内鸣膜,禽类的发

声器官 13.肺:位于胸腔背侧,扁平四方形 14.心脏:位于胸腔前下方,心基朝向前方,椎体形 15.肾:位于综荐股两旁和髂骨内面,红褐色 16.卵巢:位于左肾前部肾上腺的腹侧,上有发育着的大小不一的黄 色卵泡 17.输卵管:分为:漏斗部,壶腹部,峡部,子宫,阴道五部分 壶腹部:受精部位 壶腹部:产生蛋清的部位 峡部:形成蛋壳膜 子宫:形成蛋壳及其色素 阴道:在蛋壳外面形成少量灰质 18.髂腓肌:相当于臀股二头肌,位于髂骨脊,以圆腱止于腓骨 19.坐骨神经:位于髂腓肌下面,体内最粗大的神经,白色,线状 七、体会:通过这次解剖实验课,我对鸡的一些组织和器官有了一 定的了解,也掌握了相关的一些知识。最重要的是在上课的过程中体会到了乐趣。在外人看来也许解剖课很没意思,但在老师的讲解下,我们不仅掌握了知识,也获得了乐趣。 生物工程09级1班

百鸡百钱——程序设计

深圳大学实验报告课程名称:高级程序语言设计 实验项目名称:“百钱买鸡问题”学院:信息工程学院 专业: 指导教师: 报告人:学号:班级: 实验时间: 实验报告提交时间: 教务处制

实验目的与要求: “百钱买鸡问题”: 设1个公鸡值5钱,1个母鸡值3钱,3个小鸡值1钱,现用100钱来买鸡,问有多少种方法买鸡? (每种方法需包含公鸡、母鸡、小鸡的个数)。 编写一个程序,输出每一种方法的公鸡、母鸡、小鸡个数,并且统计出有多少种方法。要求:流程图、代码、结果、分析。 程序代码: #include void main () { int i,j,k,n=0; for(i=0;i<=20;i++) for(j=0;j<=33;j++) for(k=0;k<=300;k+=3) if(k==300-15*i-9*j) { printf("i=%d,j=%d,k=%d\n",i,j,k); n++; } printf("总方法数:%d\n",n); }

流程图: 数据处理分析: 设一百只鸡中公鸡、母鸡、小鸡分别为 i,j,k 问题化为三元一次方程组: 这里 i,j,k 为正整数,且k是3的倍数;由于鸡和钱的总数都是100,可以确定i,j,k 的取值范围: 1)i的取值范围为0~20 2)j的取值范围为0~33 3)k的取值范围为0~300,步长为3 对于这个问题我们可以用列举的方法得出i,j,k的所有可能组合,最后得到问题的解。(int i,j,k ,n=0; /*公鸡、母鸡、小鸡的只数、方法数*/) 初始算法 1.初始化为1; 2.计算i循环,找到公鸡的只数; 3.计算j循环,找到母鸡的只数; 4.计算k循环,找到小鸡的只数; 5.结束,程序输出结果后退出。 算法细化 算法的步骤1实际上是分散在程序之中的,由于用的是for循环,很方便的初始条件放到了表达式之中了。步骤2和3是按照步长1去寻找公鸡和母鸡的个数。

c++、python、vb求解百钱百鸡问题

我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱三;鸡母一,值钱二;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何? 翻译过来,意思是公鸡一个三块钱,母鸡一个二块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只? 题目分析 如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成方程式组。设公鸡x 只,母鸡y 只,小鸡z 只,得到以下方程式组: A:3x+2y+1/3z = 100 B:x+y+z = 100 C:0 <= x <= 100 D:0 <= y <= 100 E:0 <= z <= 100 如果用解方程的方式解这道题需要进行多次猜解,因此我们用穷举法的方式来解题。 1.C++语言 #include using namespace std; int main() { int i,j,k,x,y,z; for (i=0;i<=33;i++) for(j=0;j<=50;j++) for(k=0;k<=100;k++) if((3*i+2*j+k/3==100)&&(i+j+k==100)&&k%3==0) cout<

if (3*i+2*j+k/3==100) and (i+j+k==100) and (k%3==0): print(i,j,k) 3.VB语言 Dim a As Integer, b As Integer, c As Integer For a = 0 To 33 For b = 0 To 50 For c = 0 To 100 If 3 * a + 2 * b + 1 / 3 * c = 100 And a + b + c = 100 Then Print "公鸡" & a, "母鸡" & b, "小鸡" & c End If Next c Next b Next a

百钱买百鸡实验报告

一、题目描述 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何? 翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只? 二、解题思路 对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)n=100

C程序设计:百钱百鸡问题

百钱百鸡问题 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何? *题目分析与算法设计 设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程: 5x+3y+z/3=100 x+y+z=100 所以此问题可归结为求这个不定方程的整数解。 由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。 *程序说明与注释 #include void main() { int x,y,z,j=0; printf("Folleing are possible plans to buy 100 fowls with 100 Yuan.\n"); for(x=0;x<=20;x++) /*外层循环控制鸡翁数*/ for(y=0;y<=33;y++) /*内层循环控制鸡母数y在0~33变化*/ { z=100-x-y; /*内外层循环控制下,鸡雏数z的值受x,y的值的制约*/ if(z%3==0&&5*x+3*y+z/3==100) /*验证取z值的合理性及得到一组解的合理性*/ printf("%2d:cock=%2d hen=%2d chicken=%2d\n",++j,x,y,z); } } *运行结果 Follwing are possible plans to buy 100 fowls with 100 Yuan. 1:cock=0 hen=25 chicken=75 2:cock=4 hen=18 chicken=78 3:cock=8 hen=11 chicken=81 4:cock=12 hen=4 chicken=84 *总是的进一步讨论 这类求解不定方程总理的实现,各层循环的控制变量直接与方程未知数有关,且采用对未知数的取值范上穷举和组合的方法来复盖可能得到的全部各组解。能否根据题意更合理的设置循环控制条件来减少这种穷举和组合的次数,提高程序的执行效率,请读者考虑。

概率论与数理统计实验报告

电子31 JL21405106 杨路生 概率论与数理统计 实验报告 1:n个人中至少有两人生日相同的概率是多少?通过计算机模拟此结果。 n个人生日的组合为a=365^n,n个人中没有生日相同的组合为b=365*364*......*(365-n+1),则n个人中至少有两个人生日相同的概率为1-b/a。 编程: n=input('请输入总人数n='); a=365^n; m=n-1; b=1; for i=0:1:m b=b*(365-i); end f=1-b/a 输出结果:(令n=50)

结果:当人数为50人时,输出结果为0.9704,此即说明50人中至少有两人生日相同的概率为0.9704。 2:设x~N(μ,σ2),(1)当μ=1.5,σ=0.5时,求p{1.8

百鸡问题

百鸡问题 我国北魏时期有一位小孩名叫张邱建,他从小聪明伶俐尤其擅长计算,在当地名气很大。县令听说后就决定考一考他。于是县令交给他一百文,要买张邱建家的一百只鸡,而且要求钱数必须正好。当时鸡的价格如下:公鸡每只五文,母鸡每只三问,小鸡三只一文。张邱建很快就算出结果。县令有交给他一百文,让他再买来一百只鸡,不能与上次相同,张邱建很快就算好了,一连三次,张邱建拿来的鸡正好都是一百只,钱数也正好是一百文。县令连连称奇,赞不绝口。 我们试着算一下这个问题。假设公鸡x 只,母鸡y 只,小鸡z 只。那么根据县令的要求我们可以列出如下两个方程: ?? ???=++=++1003z 3y 5x 100z y x 该问题中有三个未知数,有两个方程,我们把它称为不定式方程。在解的时候可以用其中一个未知数,表达另外两个未知数,再结合条件限制,就可以确定方程的解。 我们把z 看成常量。则可知 ?? ???-=-=z y z 3720010034x 因为x,y 分别代表的是公鸡母鸡只数,所以x,y 是大于0的自然数。所以z 34,z 3 7是整数因此,z 必须是3的倍数。又因为x,y 大于零。

因为x 大于0,所以100z 3 4-大于零,因此在z>754300=。 因为y 大于0,所以z 37200—大于零,因此z<75857600=。 因为76到85之间的3的倍数有78,81,84 因此z 只能取78,81,84这三个数。 当z=78时,x=4100-7834=?;y=18783 7200=?—。 当z=81时 x=8100-813 4=?;y=118137200=?—。 当z=84时 x=12100-8434=?;y=48437200=?— 所以满足条件的解有三组,即公鸡4只,母鸡18只,小鸡78只;公鸡8只,母鸡11只,小鸡81只;公鸡12只,母鸡4只,小鸡84只。

百鸡百钱问题实验报告

百鸡百钱问题 摘要: 本次报告主要讨论百鸡百钱问题,通常使用蛮力法策略,用枚举法来表现,列举出满足问题条件的解,排除一些明显不合理情况,分别验证解的可行性,得到最优算法。 关键词:蛮力法;枚举法;百鸡百钱; Hundred chickens money Abstract: This paper reports hundred chickens money, u sually using a brute force method strategy, use enumeration method to the performance, meet the conditions listed problem solution, exclude some obvious unreasonablesituation, respectively, to verify the feasibility of the solution, optimal algorithm. Key words: the brute force method; enumeration; hundred chickens money; 1 引言 在求解一个较小规模的问题时,可以根据问题中的约束条件把可能的情况一一列举出来,然后注意尝试从中找到满足约束条件的解,若该问题规模较大,符合条件的情况很多,则需要进一步考虑,排除一些明显不合理的情况,尽可能减少问题可能解的列举数目。 2 问题概述 公元前5世纪,我国古代数学家张丘建在他的《算经》中提出了著名的百鸡百钱问题“鸡翁一,值钱五;鸡母一,值钱三;鸡雏一,值钱一;百钱买百鸡,鸡翁,母,雏各几何?” 3算法设计 根据问题中的约束条件将可能的情况一一列举出来,但如果情况很多,排除一些明显的不会理的情况,尽可能减少问题可能解的列举数目,然后找出满足问题条件的解。 完成百鸡百钱问题的常规算法(懒惰枚举)的实现和改进算法(非懒惰枚举)的实现,以实验方法证明对于同一问题可以有不同的枚举范围,不同的枚举对象,解决问题的效益差别会很大。 算法设计一 懒惰枚举法:首先问题有三种不同的鸡,那么我们可以设鸡翁为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+z/3=100。 流程图如下所示:

利用“百钱买百鸡”探讨穷举法

利用“百钱买百鸡”探讨穷举法 山东省鱼台县第一中学范海涛2009年7月23日16:35 浏览:97 专家浏览:0 | 评论:10 专家评论:0 利用“百钱买百鸡”探讨穷举法 【课标要求】 (1)了解穷举法的基本概念及用穷举法设计算法的基本过程。 (2)能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题。 【教材处理】 由于这是学生首次接触用非解析法解题,如果要求学生很快掌握其基本过程并且能对算法进行优化,将是不现实的。尤其是考虑到学生的信息技术基础参差不齐,可能差距较大,基础差的学生在可能不能接受太多的内容;而且,就算能“吸收”到全部内容,未必就能全部“消化”。 本节课选取来自《张邱建算经》的百钱买百鸡问题作为本次教学的主题。这样既能提高学生学习的兴趣,又能使学生容易掌握知识,还可以培养学生的民族自豪感和通过建立数学模型和设计程序解决实际问题的习惯。 【学生情况分析】 1、学生在本节课前学习高中信息技术新课程的《算法与程序设计》模块已经有一段时间了,学生对算法和程序设计有了一定的认识,但是在面对实际问题时如何设计算法并且用程序实现算法来解决问题上,尤其是对于无法用解析法解决或者是用解析法解决比较困难的问题如何设计算法还是没有什么思路; 2、“百钱买百鸡”问题的数学模型是解不定方程,学生在初中的数学课上学过。本次课在原有知识的基础上,通过对实际问题的分析找到合适的数学模型,使学生基本理解和掌握穷举法解题的思路; 【教学目标】 1、知识与技能 (1)了解非解析法解题的基本思路; (2)理解和掌握穷举法解题的思路, 2、过程与方法 经历分析问题、建立数学模型、编写和调试程序,得到最终结果的过程,理解和掌握用穷举法解题的基本思路与过程; 3、情感态度与价值观 (1)通过主题任务的完成,激发民族自豪感和自身的成就感; (2)通过小组讨论与探究活动,提高团队合作能力,促进探究的热情; (3)通过结合学习生活的实际例子,进一步提高利用信息技术解决学习、生活问题的能力。【教学重点与难点】 重点:用穷举法解题的基本思路和过程 难点:分析问题建立数学模型,构造算法 【教学策略】 教学理念与方法:以培养学生的信息素养为前提,遵循“学生是学习的主体,教师是学习的指导者”的新课程教学理念,根据本节课中各个知识点的联系,采用了“主题任务”的教学模式,通过任务驱动法,利用多媒体教学系统和投影设备,使学生在任务中学习,在实践中探究,在探究中总结归纳知识规律和方法,加强知识的实际应用。

百钱买百鸡的三种做法 C语言

问题概述 一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。 这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x,y,z,问题化为三元一次方程组: 这里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 /*公鸡、母鸡、小鸡的只数*/ 三重循环做法(穷举法) #include #include //由于笔者用的devc++编程,所以需要加system("pause");语句暂停程序 int main() { inta,b,c; //a,b,c分别为公鸡母鸡还有小鸡的数量(均得到大致范围) printf("本程序用来解决百钱买百鸡的问题。\n"); system("pause"); for(a=0;a<=15;a++) for(b=0;b<=25;b++) for(c=66;c<=100;c+=3) if(a+b+c==100&&5*a+3*b+c/3==100) //判断条件 printf("分配:公鸡%d只,母鸡%d只,雏鸡%d只,为百钱买百鸡的答案。\n",a,b,c); system("pause"); return 0; } //程序中的算法自己已经通过不买公鸡or母鸡的方法求得大约界限,缩小了循环的范围。 //程序错误:原来通过二元二次方程得到for(c=66;c<=75;c+=3),但那个是为了检测a和b

百钱百鸡经典例题

1.兔子繁衍问题: #include void main() { int f1=1,f2=1,f3,i; printf("第%d个月的兔子数为:%d\n",1,f1); printf("第%d个月的兔子数为:%d\n",1,f2); for(i=3;i<=50;i++) { f3=f1+f2; printf("第%d个月的兔子数为:%d\n",i,f3); f1=f2; f2=f3; } } 输出结果:

2.素数判断及输出问题: #include #include void main() { int m,i,flag=1,x; printf("请输入一个整数:\n"); scanf("%d",&m); x=(int)sqrt(m); for(i=2;i<=x&&flag==1;i++) if(m%i==0) { flag=0; printf("%d不是素数\n",m); } if(flag==1) printf("%d是素数\n ",m); } 输出结果:

3.百钱百鸡问题(穷举法) #include void main() { int x,y,z; printf("***百钱百鸡问题***\n"); for(x=1;x<20;x++) for(y=1;y<33;y++) for(z=3;z<100;z+=3) if(5*x+3*y+z/3==100&&x+y+z==100) printf("(公鸡数为%d 母鸡数为%d 小鸡数为%d)\n",x,y,z); } 输出结果: 4.掉页页码问题(穷举法) #include void main() { int n=1,x,s=0,flag=1; while(flag) { s=s+n; for(x=1;x<=n;x++) if(s-x-(x+1)==140) { printf("总页数为%d页,撕掉页为第%d页\n",n,x);

相关文档