百钱买百鸡问题--优化的力量
从“百钱买百鸡”与“求完数”问题浅谈算法优化
c ik ” c ik; hc = + hc )
解法 2比解法 1 率要高 , 以看 出 , 效 可 解法 2中计算 机执 行指令 次数 大约是 2 * 3 1 0 6 0 0次 ( . 0 3 * 0= 6 0 66万次 ) 。因为 问 题规模不大 , 以, 所 我们在运行上面两个程序 时都很快 , 觉不 感
S t . . i tn t oc ysem out pr n l rt k=” oc c +c k+” t n=” 、 he +hen+” t 、
1 0钱 刚好要用完 , 0 鸡翁 、 鸡母 和鸡雏都必须要 买到 ( = )显 > 1,
然, 小鸡 的个数必须是 3的倍数 ) 。 解法 1以下代码全部是 用 J v 语言编写 ) ( aa :
】
1 解 法 1的程序运行 结果 : 解法 2的程序运行 结果:
fI o k 1 o k 1 0c c + ) o( c = ; c < 0 ; k + c c o
 ̄r e = ;e < O ;e + ) ( n l n l 0h n + h h fI hc = ;hc < 0 ; ik + 0c l( ik 1 ik 1 0c c + ) c h
i f
( ok h n c ik = 0 ) 5 o k 3 h n c ik3 = 0 ) ( c + e + hc = 1 0&&( c cc + e + hc /= 1 0 &&c ik : 0) (hc%3 = )
算法-经典趣题-百钱买百鸡
算法-经典趣题-百钱买百鸡本⽂为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原创⽂章,转载请注明:转载⾃。
算法设计与分析课程的“百钱买百鸡问题”趣用
143计算机教育Computer Education第 3 期2016 年 3 月 10 日中图分类号:G6420 引 言算法设计与分析课程是高等学校计算机科学与技术及其相关专业的核心课程,如计算机科学与技术专业、软件工程专业、信息安全专业、信息与计算科学专业、管理信息系统专业、通信工程专业等。
该课程旨在培养学生使用计算机分析问题、解决问题的能力,并掌握算法设计的基本方法。
由于算法分析与设计涉及的专业广、学生的层次多,因此,探索算法分析与设计的教学模式与方法正日益引起广大教育者的重视[1]。
当前算法设计与分析课程的教学,普遍存在以下问题:①学生缺乏学习算法的自觉性和积极性;②学生比较厌烦算法的教学内容,对课程的重视程度不够;③教学方法过于简单陈旧;④传统的教学侧重于知识的传授,对学生的学习兴趣等因素重视不够[2]。
这些问题严重影响了算法设计与分析课程教学的效果与质量。
笔者多年从事算法设计与分析课程的教学,不但在教学方法、教学手段上进行了多次有效的改革,同时特别重视第一堂课的引导教学,通过设计“百钱买百鸡问题”教学案例,充分培养学生的学习兴趣,为该课程的学习打下较好的兴趣基础。
“百钱买百鸡问题”教学案例的具体设计方法首先要求学生根据自己所学的知识完成程序设计,然后在分析时间复杂度的基础上,结合初中数学问题引导学生不断进行算法优化,最终从1 000 000次运算优化到4次运算。
在教学过程中,教师加强引导,注重交流,给合数学问题进行算法设计与分析。
学生不但理解了算法优化的重要性,而且认识到在解决问题的过程中结合数学问题进行算法设计的必要性,进一步激发了其学习兴趣,为该课程的学习打下了较好的基础。
1 百钱买百鸡问题描述“百钱买百鸡问题”记载于中国古代约5~6世纪成书的《张邱建算经》中,是原书卷下第38题,也是全书的最后一题。
该问题的描述为:今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。
凡百钱买鸡百只,问鸡翁、母、雏各几何[3]?翻译与现代汉语的意思是:公鸡每只值5文钱,母鸡每只值3文钱,而3只小鸡值1文钱。
百钱买百鸡问题
百钱买百鸡问题百钱买百鸡问题题⽬:公元前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); }}}}}。
多种解法求百钱百鸡问题
学号: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.结束,程序输出结果后退出。
百钱买百鸡解题思路数学
百钱买百鸡这个题目是一个著名的数学难题,它要求用一百个钱币购买一百只鸡,其中公鸡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编程解决这个数学难题,并且通过计时器显示执行时间,了解求解过程的耗时情况。
百钱百鸡问题
百鸡问题
公元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语言的编程语法规则熟悉了许多,虽然在运行过程中出现了一些错误,但也都能够较快地解决,第一次的数据结构实验作业总体完成的还算比较顺利。
趣题巧解-《张邱建算经》“百鸡问题”
趣题巧解-《张邱建算经》百鸡问题
古代《张邱建算经》中的百鸡问题是一道很有名的算题。
题目内容是:用100元买100只鸡,大公鸡5元1只,母鸡3元1只,小鸡1元3只。
问各能买多少只?想:把三种鸡的只数分别设为未知数x、y、z,然后利用总只数、总钱数两个条件,列出两个方程,根据鸡的只数必须取整数的要求,一步一步推出各种鸡的只数。
解:设大公鸡x只,母鸡y只,小鸡z只。
根据题意,得把③式代入①式z+y+6x+3y=100得 x2=8y3=18把x、y的解代入③式得答:买大公鸡12只,母鸡4只,小鸡84只;或买大公鸡8只,母鸡11只,小鸡81只;或买大公鸡4只,母鸡18只,小鸡78只。
百钱买百鸡的三种做法 C语言
问题概述一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。
这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x,y,z,问题化为三元一次方程组:这里x,y,z为正整数,且z是3的倍数;由于鸡和钱的总数都是100,可以确定x,y,z的取值范围:1) x的取值范围为1~202) y的取值范围为1~333) z的取值范围为3~99,步长为3对于这个问题我们可以用穷举的方法,遍历x,y,z的所有可能组合,最后得到问题的解。
当然也可以简化算法去完成这个问题。
数据要求问题中的常量:无问题的输入:无问题的输出:int x,y,z /*公鸡、母鸡、小鸡的只数*/三重循环做法(穷举法)#include <stdio.h>#include <stdlib.h>//由于笔者用的devc++编程,所以需要加system("pause");语句暂停程序int main(){int a,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的最大值,而不能用来恒定c。
小学奥数百鸡问题详解
小学奥数百鸡问题详解百鸡问题,现代数学用不定方程求解,在小学阶段,不少同学都是用拼凑的办法来解决。
这里介绍一种新方法,对小学生很适用《张丘建算经》中有这样一题:公鸡每只值5文钱,母鸡每只值3文钱,小鸡每3只值1文钱。
现在用100文钱买100只鸡,公鸡、母鸡、小鸡各有多少只?这是中国古代算术中的一类典型问题百鸡问题,现代数学用不定方程求解,在小学奥数题解题中,不少同学都是用拼凑的办法来解决。
这里介绍一种新方法,对小学生很适用。
1、求倍数。
每只公鸡值5文钱,每只母鸡值3文钱,每只小鸡值1/3文钱。
以最便宜的小鸡为标准,公鸡和母鸡的价格分别是小鸡的51/3=15倍和31/3=9倍。
2、算超额。
假设100文钱全部买小鸡,可买1001/3=300只,超出实有三种鸡总数300-100=200只。
3、组等式。
由于公鸡置换成小鸡可多出自身只数的15-1=14倍,母鸡置换成小鸡可多出自身只数的9-1=8倍。
不难理解,上述假设中多出的200只即为公鸡和母鸡置换成小鸡后一共增加的只数,关系式为:公鸡只数14+母鸡只数8=200.4、试结果。
一般来说,不定方程的正整数解按关系式就可以观察得到。
我们也可以先把等式变形,观察起来更为容易。
方法是,在等式两边同时除以一个相同的数(0除外),得到等式右边为整数,左边只有一项系数是分数的形式。
在上式两边同时除以8,得到:公鸡只数7/4+母鸡只数=25.显然,公鸡只数必须是4的倍数。
这样,从4 起,依次用4的倍数去试算,可以得出三种情况:公鸡4只,母鸡18只,小鸡78只;或公鸡8只,母鸡11只,小鸡81只;或公鸡12只,母鸡4只,小鸡84只。
下面再举一例来验证。
大数学家欧拉曾提出过这样的问题:一头猪321(31 2)银币,一只山羊131(11 3)银币,一只绵羊21(1/2)银币。
有人用100个银币,买了100头牲畜。
问:猪、山羊、绵羊各多少?猪的单价是绵羊的31 21/2=7倍,山羊的单价是绵羊的11 31/2=22 3倍,猪和山羊分别置换成绵羊,可多出自身只数的7-1=6倍和22 3-1=12 3倍。
算法经典问题系列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.这个算法学生容易想到,而重复是计算机的拿手好戏,算法可读性好。
百钱买百鸡问题
算法经典问题系列1 百钱买百鸡问题
一说起唐朝 人们就会情不自禁地想起诗歌 绝对没有人会提到数学在数
学上 虽说唐代并没有产生与其前的魏晋南北朝或其后的宋元相媲美的大师 却在数学教育制度的确立和数学典籍的整理方面有所建树.长达近三百年的唐代在数学方面最有意义的事情莫过于《算经十书》的整理和出版 这是高宗李治下令编撰的。
除了《周牌算经》《九章算术》《海岛算经》和《缀术》以外 《算经十书》中至少还有三部值得一提 分别是《孙子算经》《张丘建算经》和《缉古算经》'这三部书的共同特点是 每一部都提出了一个非常有价值的问题 并以此传世。
《张丘建算经》成书于公元5世纪 作者是北魏人.书中最后一道题堪称亮
点 通常也被称为"百钱买百鸡"问题 民间则流传着县令考问神童的佳话书中原文如下
今有鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买鸡百只
问鸡翁、母、雏各几何?
题目的意思是 公鸡5文钱1只 母鸡3文钱1只 小鸡1文钱买3只
现在用100文钱共买了100只鸡 问 在这100只鸡中 公鸡、母鸡和小鸡各是多少只?(设每种至少一只)算法分析
此题很显然是用枚举法 我们以三种鸡的个数为枚举对象(分别设为
x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件 穷举各种鸡的个数。
枚举法 常常称之为穷举法 是指从可能的集合中一一枚举各个元素 用
题目给定的约束条件判定哪些是无用的 哪些是有用的。
能使命题成立者 即为问题的解。
1.采用枚举算法解题的基本思路
2.确定枚举对象、枚举范围和判定条件。
百钱买百鸡数学解法
百钱买百鸡数学解法
百钱买百鸡是一个古老的数学问题,其解法可以帮助我们锻炼数学思维和逻辑推理能力。
问题描述:有100元钱,要买100只鸡。
公鸡5元一只,母鸡3元一只,小鸡1元三只。
问应该如何购买,才能恰好花光100元钱并买到100只鸡?
解法:假设公鸡、母鸡、小鸡的数量分别为x、y、z,那么有以下几个条件:
1. x + y + z = 100(总数为100只鸡)
2. 5x + 3y + z/3 = 100(总价为100元钱)
将第二个条件化简得到:
15x + 9y + z = 300
根据第一个条件将z表示为z = 100 - x - y,代入上式得到: 15x + 9y + 100 - x - y = 300
化简得到:
14x + 8y = 200
将式子左右两边同时除以2得到:
7x + 4y = 100
由此可以得到一个结论:x和y必须满足7的倍数关系,因为4y 必须是4的倍数,而且100 - 7x也必须是4的倍数。
因此,我们可以在x和y的限制条件下,穷举出所有可能的解,并检查是否符合第二个条件。
最终得到的解为:
公鸡20只,母鸡40只,小鸡40只。
这个问题的解法虽然比较简单,但是通过这个问题可以锻炼我们的数学思维和逻辑推理能力,帮助我们更好地理解和应用数学知识。
古代数学中的百元买百鸡问题
百鸡问题是一个数学问题,出自中国古代约5—6世纪成书的《张丘建算经》,是原书卷下第38题,也是全书的最后一题,该问题导致三元不定方程组,其重要之处在于开创“一问多答”的先例。
问题原文:今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。
凡百钱买鸡百只,问鸡翁、母、鶵各几何?答曰:鸡翁四,值钱二十;鸡母十八,值钱五十四;鸡鶵七十八,值钱二十六。
又答:鸡翁八,值钱四十;鸡母十一,值钱三十三,鸡鶵八十一,值钱二十七。
又答:鸡翁十二,值钱六十;鸡母四、值钱十二;鸡鶵八十四,值钱二十八。
”原书没有给出解法,只说如果少买7只母鸡,就可多买4只公鸡和3只小鸡。
所以只要得出一组答案,就可以推出其余两组答案。
中国古算书的著名校勘者甄鸾和李淳风注释该书时都没给出解法,只有约6世纪的算学家谢察微记述过一种不甚正确的解法。
到了清代,研究百鸡术的人渐多,1815年骆腾风使用大衍求一术解决了百鸡问题。
1874年丁取忠创用一个简易的算术解法。
在此前后时曰醇(约1870)推广了百鸡问作《百鸡术衍》,从此百鸡问题和百鸡术才广为人知。
百鸡问题还有多种表达形式,如百僧吃百馒,百钱买百禽等。
宋代杨辉算书内有类似问题,中古时近东各国也有相仿问题流传。
例如印度算书和阿拉伯学者艾布·卡米勒的著作内都有百钱买百禽的问题,且与《张邱建算经》的题目几乎全同。
解法数学解法从现代数学观点来看,实际上是一个求不定方程整数解的问题。
解法如下:设公鸡、母鸡、小鸡分别为x、y、z 只,由题意得:①……x+y+z =100②……5x+3y+(1/3)z =100有两个方程,三个未知量,称为不定方程组,有多种解。
令②×3-①得:7x+4y=100;所以y=(100-7x)/4=25-2x+x/4令x/4=t, (t为整数)所以x=4t把x=4t代入7x+4y=100得到:y=25-7t易得z=75+3t所以:x=4ty=25-7tz=75+3t因为x,y,z为正整数所以4t大于025-7t大于075+3t大于0解得t大于0小于等于25/7 又因为t为整数所以t=1时x =4;y =18;z =78当t=2时x =8;y =11;z =81当t=3时x =12;y =4;z =84。
枚举法解决百元买百鸡
7
LOGaO
百元买百鸡问题
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))
• 枚举也称穷举,指的是从问题可能的解的集 合中一一列举各元素。
• 用题目给定的条件判定哪些是无用的,哪些 是有用的。能使命题成立,即为其解。
• 本质上属于搜索算法
2
LOGaO
什么是枚举法
❖特点
• 容易理解,步骤单一。 • 得到的结果肯定是正确的。 • 通常会涉及到求极值(如最大,最小等)。 • 数据量大的话,可能会造成时间崩溃。
logothankyousuccess202036可编辑logo百元买百鸡问题限定变量的取值范围x的取值范围是1x20y的取值范围是1y33减少循环的层数判断时间z100xy信息工程学院有没有更好的解法logo百元买百鸡问题c语言解法
a
信息工程学院
什么是枚举法
❖基本思想
5
LOGaO
百元买百鸡问题
【例2】鸡翁一,值钱五,鸡母一,值钱三,鸡
雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各
几何?
解题思路:
设鸡翁、鸡母、鸡雏的数量分别为x,y,z, 则有以下方程
x+y+z=100
5x+3y+z/3=100 此三元一次方程有多个解,可用枚举法求解。
百钱百鸡问题的课程思政
百钱百鸡问题的课程思政百钱百鸡问题是一个经典的数学问题,而在课程思政的背景下,我们可以将这个问题与社会主义核心价值观、中华优秀传统文化等相结合,引导学生树立正确的价值观和世界观。
一、引入首先,教师可以简要介绍百钱百鸡问题的背景和起源,强调这是一个源自中国古代的数学问题,体现了中华民族的智慧和创造力。
同时,教师可以引导学生思考这个问题的现实意义,如公平交易、诚信经营等。
二、问题分析接下来,教师可以引导学生分析百钱百鸡问题。
这个问题要求用100文钱买100只鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱三只。
通过分析,学生可以发现最优解是买20只公鸡、25只母鸡和55只小鸡,正好用完100文钱。
三、思政元素融入在这个过程中,教师可以结合社会主义核心价值观,引导学生认识到诚信、公正、友善等价值观念在解决这个问题中的体现。
例如,公鸡、母鸡和小鸡的价格设置体现了公平交易的原则;最优解的寻找则体现了勤劳智慧和创新精神;同时,这个问题的解决也需要学生们友善合作,互相交流。
四、中华优秀传统文化融入教师还可以结合中华优秀传统文化,引导学生思考这个问题的文化内涵。
例如,这个问题体现了中国古代的数学智慧和商业文化,是中国古代人民勤劳智慧的结晶。
通过学习这个问题,学生可以更加深入地了解中华优秀传统文化的内涵和价值。
五、课堂总结最后,教师可以对本节课进行总结。
通过解决百钱百鸡问题,学生不仅学习了数学知识和方法,更是在潜移默化中接受了社会主义核心价值观和中华优秀传统文化的熏陶。
希望学生们在未来的学习和生活中,能够将这些价值观念内化为自己的行为准则,为实现中华民族伟大复兴贡献自己的力量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<"x= "<<x<<" y= "<<y<<" z= "<<100-x-y<<endl; }
方法三: 将原三元一次方程组中的变量 x 看着常数,则 y,z 可以用 x 表示: y = 25-7*x/4 z = 75+3*x/4
void hectoMC_3() {
size_t x,y,z; for(x=4;x<=16;x+=4) {
百钱买百鸡问题 -- 优建在他的《算经》中提出了著名的"百钱买百鸡问题":
鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问翁、母、 雏各几何? 基本思想
利用计算机来解决"百钱买百鸡问题"是程序设计语言中的一个经典的例子, "百钱买百鸡问题"的解决,基本思想是采用穷举法,即列举各种可能的买鸡情况 从中选出鸡的总数为 100 只且买鸡的钱也刚好是 100 元的公鸡、母鸡和小鸡数, 但是采用不同的思路,可以得到不同的算法,其效率也不尽相同。
方法二: 利用两重循环 将 x+y+z = 100 带入到第二个方程中化简可得: 7*x+4*y=100
void hectoMC_2() {
size_t x,y; for(x=1;x<=19;++x) //要习惯 for 循环中的前置++
for(y=1;y<=32;来自+y) if(7*x+4*y==100)
size_t x,y,z; for(x=1;x<=19;++x)
for(y=1;y<=32;++y) for(z=3;z<=96;z+=3) if(x+y+z==100 && 5*x+3*y+z/3==100) cout<<"x= "<<x<<" y= "<<y<<" z= "<<z<<endl;
}
size_t x; for(x=4;x<=12;x+=4)
cout<<"x= "<<x<<" y= "<<25-7*x/4<<" z= "<<75+3*x/4<<endl; } 其实只有三个取值,你完全可以不用 for 循环直接输出结果。后续时间复杂度什 么的分析就不分析了,根据程序一目了然。
虽然程序很简单,但是我们可以从中知道任何程序都是可以不断被优化的, 优化的力量是无穷的!
y = 25-7*x/4; z = 75+3*x/4; if(y>0 && y<=32 && z<=96) cout<<"x= "<<x<<" y= "<<y<<" z= "<<z<<endl; } }
方法四: 继续方法三,我们发现: 根据 y = 25-7*x/4;和 y>0(其实是 y>=1)的条件,我们可以推导出,x 满足 4<=x<=12 且能被 4 整除,即只能取 4,8,12 三个值。 y = 25-7*x/4;可以肯定 y<=25<32,所有 y<=32 这个条件不需要。 根据 4<=x<=12,则 z = 75+3*x/4<=75+9<=84<96,因此第三个条件 z<=96 也不需 要判断。因此我们的终极程序就是: void hectoMC_4() {
下面我们用不同的方法来求解这个简单的问题并分析各自的效率。 设公鸡 x,母鸡 y,小鸡 z。则必须有: x + y + z = 100 5*x + 3*y + z/3 = 100
方法一: 简单的理由 x,y,z 的范围构造三重 for 循环, 1<=x<=19 1<=y<=32 3<=y<=98 且整除 3 void hectoMC() {