百钱百鸡问题

合集下载

百钱买百鸡问题--优化的力量

百钱买百鸡问题--优化的力量

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只问一百只鸡中公鸡母鸡小鸡各多少?这是一个古典数学问题设一百只鸡中公鸡母鸡小鸡分别为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 的细化

百钱百鸡问题

百钱百鸡问题

个未知数 ,设公鸡、母鸡、小鸡的数量分别 为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求解百钱百鸡问题

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 的所有可能组合,最后得到问题的解。
相关文档
最新文档