百钱百鸡问题
百钱买百鸡问题--优化的力量
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)
古代数学中的百元买百鸡问题
百鸡问题是一个数学问题,出自中国古代约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。
百钱买百鸡问题
百钱买百鸡问题百钱买百鸡问题题⽬:公元前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,那么可以得到以下三个方程:1) x + y + z = 100(总数量为100只)2) 5x + 3y + z/3 = 100(总价值为100块钱)通过代数方法解方程组,我们可以得到公鸡的数量为4只,母鸡的数量为18只,小鸡的数量为78只。
这样公鸡、母鸡、小鸡各有多少只就得到了解决。
其次,让我们来看一下用穷举法来解决百鸡问题。
穷举法是一种通过试验所有可能的解决方案来找到问题答案的方法。
对于百鸡问题,我们可以逐一尝试所有可能的组合,直到找到满足条件的解决方案。
我们可以假定公鸡的数量从0到20只,母鸡的数量从0到33只,然后通过穷举法计算出所有可能的组合,找到满足条件的解决方案。
这种方法需要进行大量的计算,但可以确保找到所有可能的解决方案。
最后,让我们来看一下用逻辑推理来解决百鸡问题。
逻辑推理是一种通过分析问题的逻辑关系来找到答案的方法。
对于百鸡问题,我们可以通过分析鸡的数量和价格之间的逻辑关系,以及满足条件的约束条件,来找到问题的解决方案。
通过逻辑推理,我们可以发现公鸡的数量必须是4的倍数,母鸡的数量必须是3的倍数,而小鸡的数量必须是1的倍数。
通过这些逻辑关系,我们可以简化计算过程,找到问题的解决方案。
总的来说,百鸡问题是一道有趣的数学问题,通过学习和解决这个问题,我们可以锻炼自己的数学思维能力,提高解决问题的能力。
在实际生活中,数学问题的解决方法往往也可以应用到其他领域,帮助我们更好地理解和解决现实生活中的问题。
百钱百鸡问题
百钱百鸡问题我国古代数学家张丘建在《算经》中提出了著名的“百钱百鸡问题”:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?”意思是说:一只公鸡卖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=78i=8,j=11,k=81i=12,j=4,k=84#include<stdio.h>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);}}。
例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 的细化
百钱百鸡问题
个未知数 ,设公鸡、母鸡、小鸡的数量分别 为x、y、z则有: x+y+z=100 5x+3y+z/3=100
Hale Waihona Puke 求解问题算法一
设一百只鸡中公鸡、母鸡、小鸡分别为x,y,z, 问题化为三元一次方程组: 这里x,y,z为正整数,由于鸡和钱的总数都是100, 可以确定x,y,z的取值范围: x的取值范围为1~20 y的取值范围为1~33 z的取值范围为3~99 对于这个问题我们可以用穷举的方法,遍历x,y,z 的所有可能组合,最后得到问题的解。
算法四
《百钱百鸡》求解的是符合两个条件的三种鸡的 数量,是用两个方程求解三个未知数的问题。
x+y+z=100 5x+3y+z/3=100 当我们把公鸡数X当成已知数:则根据方程可解出母鸡、小鸡数: Y=25-7*x/4 Z=75+3*x/4
这样算法四只用一重循环来确定公鸡的数量,母鸡和小 鸡的数量由方程来计算。但要注意鸡的数量不可为负数 和小数,要加以判断。
算法二
当公鸡与母鸡的数目确定了,小鸡的数目可用总数 100减去公鸡与小鸡的数、于是三重循环可变为二 重循环。
Dim x, y, z As Integer For x = 0 To 20 For y = 0 To 33 z = 100 - x - y If (x * 5 + y * 3 + z / 3 = 100) Then Print ; "公鸡数"; x, Print ; "母鸡数"; y, Print ; "小鸡数"; z, Print End If Next y Next x
c++、python、vb求解百钱百鸡问题
我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱三;鸡母一,值钱二;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?翻译过来,意思是公鸡一个三块钱,母鸡一个二块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?题目分析如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成方程式组。
设公鸡x 只,母鸡y 只,小鸡z 只,得到以下方程式组:A:3x+2y+1/3z = 100B:x+y+z = 100C:0 <= x <= 100D:0 <= y <= 100E:0 <= z <= 100如果用解方程的方式解这道题需要进行多次猜解,因此我们用穷举法的方式来解题。
1.C++语言#include<iostream>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<<i<<" "<<j<<" "<<k<<endl;return 0;}2.Python语言for i in range(33):for j in range(50):for k in range(100):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 IntegerFor a = 0 To 33For b = 0 To 50For c = 0 To 100If 3 * a + 2 * b + 1 / 3 * c = 100 And a + b + c = 100 ThenPrint "公鸡" & a, "母鸡" & b, "小鸡" & cEnd IfNext cNext bNext a。
百钱百鸡问题
百鸡问题
公元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语言的编程语法规则熟悉了许多,虽然在运行过程中出现了一些错误,但也都能够较快地解决,第一次的数据结构实验作业总体完成的还算比较顺利。
C语言百钱买百鸡问题
C语言百钱买百鸡问题(我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?题目分析如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成方程式组。
设公鸡x 只,母鸡y 只,小鸡z 只,得到以下方程式组:A:5x+3y+1/3z = 100B:x+y+z = 100C:0 <= x <= 100D:0 <= y <= 100E:0 <= z <= 100如果用解方程的方式解这道题需要进行多次猜解,计算机的一个优势就是计算速度特别暴力并且无怨无悔,所以我们可以欺负她、蹂躏她!因此我们用穷举法的方式来解题,需要101^3 次猜解,但对于计算机来说,小CASE!代码清单:1.#include<stdio.h>2.3.int main()4.{5.int i, j, k;6.7.printf("百元买百鸡的问题所有可能的解如下:\n");8.9.for( i=0; i <=100; i++)10.for( j=0; j <=100; j++)11.for( k=0; k <=100; k++)12.{13.if(5*i+3*j+k/3==100&& k%3==0&& i+j+k==100)14.{15.printf("公鸡 %2d 只,母鸡 %2d 只,小鸡 %2d 只\n", i, j, k);16.}17.}18.19.return0;20.}运行结果:。
趣味编程数学题
趣味编程数学题趣味编程数学题通常涉及算法设计和计算思维。
下面列举一些题目:1.百钱百鸡问题:中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?请设计程序解决这个问题。
2.交通肇事逃逸:一辆卡车违反交通规则撞人后逃跑。
现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。
甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。
请根据以上线索求出车号。
3.完美立方:一个整数是另一个整数的立方,并且它的低两位数字不是00,这样的整数被称为完美立方,如8^3=512就是完美立方。
请编程找出1000以内的所有完美立方。
4.回文数:一个正整数,如果从左向右读和从右向左读都是相同的,那么这个数就被称为回文数。
例如12321就是一个回文数。
请编程找出1000以内的所有回文数。
5.水仙花数:一个三位数,其各位数字的立方和等于该数本身,则称该数为水仙花数。
例如:153=1^3+5^3+3^3。
请编程找出所有的水仙花数。
6.黑洞数:满足某种条件的数通过一种运算,都能被它“吸”进去,无一能逃脱它的魔掌,那么这种数就被称为“黑洞数”。
请编程找出所有的三位黑洞数。
7.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少桃子。
8.爱因斯坦的阶梯问题:有一个长阶梯,若每步跨2阶,则最后剩一阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨6阶则最后剩5阶;只有每步跨7阶,最后才正好一阶不剩。
请问这个阶梯共有多少阶?9.鸡蛋问题:有一堆鸡蛋,如果两个两个地拿,最后剩一个;如果三个三个地拿,最后也剩一个;如果四个四个地拿,最后还剩一个。
C程序设计:百钱百鸡问题
百钱百鸡问题中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?*题目分析与算法设计设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程:5x+3y+z/3=100x+y+z=100所以此问题可归结为求这个不定方程的整数解。
由程序设计实现不定方程的求解与手工计算不同。
在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。
*程序说明与注释#includevoid 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=752:cock=4 hen=18 chicken=783:cock=8 hen=11 chicken=814:cock=12 hen=4 chicken=84*总是的进一步讨论这类求解不定方程总理的实现,各层循环的控制变量直接与方程未知数有关,且采用对未知数的取值范上穷举和组合的方法来复盖可能得到的全部各组解。
例9-8 百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡
4.2.1 满足,输出最终百钱买到的百鸡的结果 4.2.2 不满足,不做处理 4.3 变量增加,这里注意步长为 3 流程图
版权所有:东北大学计算中心
开始 定义x,y,z
x<=20?
N
Y ;=99?
Y
百钱和百鸡?
N
Y
输出百鸡 的结果
结束
图 5-8 程序执行流程图
分析
版权所有:东北大学计算中心
程序运行结果如下: cock=4,hen=8,chicken=78 cock=8,hen=11,chicken=81 cock=12,hen=4,chicken=84 对于这个问题实际上可以不用三重循环,而是用二重循环,因为公鸡和母鸡数确定后, 小鸡数就定了,即 z 100- x - y 。请同学们自己分析二重循环和三重循环的运行次数,做为 练习自己调试这一方法。
版权所有:东北大学计算中心
程序代码如下 #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); } } } }
5x 3y z / 3 100(百钱)
x
y
z
100(百鸡)
数学百钱百鸡教学设计
数学百钱百鸡教学设计数学百钱百鸡问题是一道经典的数学问题,通过解决这道问题可以引导学生进行数学思维和逻辑推理。
以下是一种可能的教学设计:一、问题引入1. 引导学生回顾和总结前几节课所学过的相关知识点,如整数运算、方程式的解法等。
2. 出示一道数学题目:“有一百枚硬币,共值一百元,其中有鸡30只,兔70只,请问鸡和兔各有几只?”3. 提问学生是否了解此类问题,并让学生尽可能多地提出解决方案。
二、学生探究1. 让学生按小组分工合作,一起讨论解决此问题的思路。
鼓励学生主动提出自己的解决方案,并以图表、方程式等形式进行表达。
2. 引导学生提出关键问题,如“如何表示鸡和兔的数量?”,“鸡的数量如何与兔的数量相关?”等。
三、问题解决1. 梳理学生的解决思路,让学生发表自己的解答。
引导学生理解各种解决方法背后的数学原理。
2. 提供一种常见的解决思路:a. 假设鸡为x只,兔为y只。
b. 根据题意,列出方程式:x + y = 100,2x + 4y = 100。
c. 解这个二元一次方程组(可以采用消元法、代入法等)。
d. 得出鸡的数量和兔的数量。
四、情境延伸1. 引导学生将这一问题与实际生活中的问题相联系。
例如,如何根据限制条件解决某些实际问题,如购物、交通等。
2. 鼓励学生提出其他类似的问题,引导他们思考如何解决。
五、反思总结1. 让学生通过小组分享讨论他们所采用的解决思路,引导他们发现不同方法的优缺点。
2. 以小结的方式回顾这个问题,概括重点步骤和方法,巩固学生的学习成果。
3. 鼓励学生总结本课所学的数学思维方法和解决问题的能力。
这个教学设计通过引入问题、学生探究、问题解决、情境延伸和反思总结等环节,能够激发学生的兴趣、培养学生的数学思维和解决问题的能力。
希望能够为您提供一些参考。
_整除问题解不定方程(组)
整除问题解不定方程(组)普定县实验学校 王章良如果整数a 除以整数b (b ≠0),除得的商正好是整数,而没有余数,那么我们称a 能被b 整除(或b 能整除a )。
数学竞赛中常遇到一类方程(组)———未知数个数比方程的个数多[不定方程(组)]。
解答此类方程(组),如无适当方法可行,则束手无策。
现就如何用整除问题解不定方程(组),举例如下。
一、百钱百鸡问题公鸡5元一只,母鸡3元一只,小鸡1元三只,现有100元,须买一百只鸡,如何购买?分析:不妨设买得公鸡、母鸡、小鸡各有x 、y 、z 只,则有两个等式成立:5x +3y +13z =100,x +y +z =100,从而可得方程组: 5x +3y +13z =100, x +y +z =100.解此方程组即可。
解:设可以买到公鸡x 只,母鸡y 只,小鸡z 只,则有: 5x +3y +13z =100,……① x +y +z =100.……②①×3-②,并整理得:7x +4y =100,即y =25-3x 4-x .……③因为x 、y 、z 为非负整数,所以3x 须被4整除,故x =0,4,8,12……把x 的值代入③,②即可得解: x 1=0, y 1=25, z 1=75; x 2=4, y 2=18, z 2=78; x 3=8, y 3=11, z 3=81; x 4=12, y 4=4, z 4=84.当x =16时,y 为负数,不可再有解,故本题有上述四种方式可供选择。
·53·二、住宿问题现有学生若干,分住若干间宿舍,如果每间住4人,那么还有19人无住处;如果每间住6人,那么还有一间宿舍不满也不空。
求学生人数、宿舍间数。
分析:设有学生x 人,宿舍y 间,当每6人住一间宿舍时,余一间有z 人(1≤z <6),则有:x -4y =19,x -6(y -1)=z 解这两个方程组成的方程组即可。
解:设有学生x 人,宿舍y 间,当每6人住一间宿舍时,余一间有z 人,则有: x -4y =19,……① x -6(y -1)=z .……②①-②,并整理得:y =25-z 2……③x 、y 、z 为非负整数,且(1≤z <6),那么25-z 必定能被2整除,故z =1,3,5。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《百钱百鸡》问题程序设计
与算法优化
制作:
和县一中
施建国
2013年10月
提出问题:百钱百鸡问题
中国古代数学家张丘建的《算经》 中有一著名的“百钱买百鸡问题”:
鸡翁一,值钱五,鸡母一,值钱三, 鸡雏三,值钱一,百钱买百鸡,问翁、 母、雏各几何?
分析问题
用通俗的话来说,题目的意思是: 用100文钱买来100只鸡,公鸡5文钱一只,母鸡3文 钱一只,小鸡1文钱3只。问:在这100只鸡中,公鸡、母 鸡、小鸡各是多少只? 本问题的最终求解是符合两个方程条件的三
算法二
当公鸡与母鸡的数目确定了,小鸡的数目可用总数 100减去公鸡与母鸡的数、于是三重循环可变为二 重循环。
Dim x, y, z As Integer For x = 0 To 20 For y = 0 To 33 z = 100 - x - y If (x * 5 + y * 3 + z / 3 = 100) Then Print ; "公鸡数"; x, Print ; "母鸡数"; y, Print ; "小鸡数"; z, Print End If Next y Next x
本题小结:
算法一使用了三又将二重循环的次数减少,使 程序不断优化。 可见、对于同一个问题、由于思路不一 样、算法就不一样,我们应从不同的角度思 考问题、努力提高算法的效率。
算法三
算法二中,当公鸡的数量确定,母鸡的数量是随公 鸡的数量变化而变化、不需要每次都牧举到33才结 束。最大可能是33-x,于是程序可优化为:
Dim x, y, z As Integer For x = 0 To 20 For y = 0 To (33 - x) z = 100 - x - y If (x * 5 + y * 3 + z / 3 = 100) Then Print ; "公鸡数"; x, Print ; "母鸡数"; y, Print ; "小鸡数"; z, Print End If Next y Next x 运行结果为: 0 4 8 12 25 18 11 4 75 78 81 84
算法一程序
Dim x, y, z As Integer For x = 0 To 20 For y = 0 To 33 For z = 0 To 100 Step 3 If (x + y + z = 100) And (x * 5 + y * 3 + z / 3 = 100) Then Print "公鸡"; x, Print "母鸡"; y, Print "小鸡"; z End If Next z Next y Next x
个未知数 ,设公鸡、母鸡、小鸡的数量分别 为x、y、z则有: x+y+z=100 5x+3y+z/3=100
算法一
设一百只鸡中公鸡、母鸡、小鸡分别为x,y,z, 问题化为三元一次方程组: 这里x,y,z为正整数,且z是3的倍数(因为小鸡一 元三只);由于鸡和钱的总数都是100,可以确定 x,y,z的取值范围: x的取值范围为1~20 y的取值范围为1~33 z的取值范围为3~99,步长为3 对于这个问题我们可以用穷举的方法,遍历x,y,z 的所有可能组合,最后得到问题的解。