JAVA小实验计算百钱鸡问题
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:#判断钱数是否等于100if (cock+hen+biddy)==100: #判断购买的鸡数是否等于100if biddy%3==0: #判断鸡雏数是否能被3整除print ("鸡翁:",cock,"鸡母:",hen,"鸡雏:",biddy) #输出程序运行结果:鸡翁: 0 鸡母: 25 鸡雏: 75鸡翁: 4 鸡母: 18 鸡雏: 78鸡翁: 8 鸡母: 11 鸡雏: 81鸡翁: 12 鸡母: 4 鸡雏: 84。
枚举法解决百元买百鸡演示文稿
第六页,共15页。
信息工程学院
百元买百鸡问题
C语言解法一:
main()
{
int x, y, z; 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))
执行的速度严重变慢。
第五页,共15页。
信息工程学院
百元买百鸡问题
【例2】鸡翁一,值钱五,鸡母一,值钱三,鸡雏
三,值钱一。百钱买百鸡,问鸡翁、母、雏各几
何?
解题思路:
设鸡翁、鸡母、鸡雏的数量分别为x,y,z,则 有以下方程
x+y+z=100
5x+3y+z/3=100 此三元一次方程有多个解,可用优化策略
• 对问题多加分析,减少循环重数和次数。
• 合理选择用于枚举的变量。 • 减少每种情况的判断时间。 • 是否有其他更好的方法。
第十四页,共15页。
信息工程学院
知识拓展
❖试用枚举法解决以下两个问题
• 从1—10的10个数中,每次取2个数,要使它们的和大 于10,一共有多少种取法?
if((z%3==0)&&(x+y+z==100)&&(5*x+3*y+z/3==100))
printf(“鸡翁%d只,鸡母%d只,鸡雏%d只\n",x,y,z);
}
第八页,共15页。
信息工程学院
百鸡问题知识点总结
百鸡问题知识点总结首先,让我们来看一下百鸡问题的描述:假设有一百只鸡和一百块钱,公鸡值五块钱,母鸡值三块钱,小鸡值一块钱,现在需要用这一百块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?在这个问题中,我们需要找到一种解决方法,使得公鸡、母鸡和小鸡的数量加起来等于一百只,并且总价值等于一百块钱。
我们可以通过代数方法、穷举法、逻辑推理等多种方式来解决这个问题。
首先,让我们来看一下用代数方法来解决百鸡问题。
设公鸡的数量为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的倍数。
通过这些逻辑关系,我们可以简化计算过程,找到问题的解决方案。
总的来说,百鸡问题是一道有趣的数学问题,通过学习和解决这个问题,我们可以锻炼自己的数学思维能力,提高解决问题的能力。
在实际生活中,数学问题的解决方法往往也可以应用到其他领域,帮助我们更好地理解和解决现实生活中的问题。
JAVA编程-百钱买百鸡详解
题目:我国古代数学家张丘建成在《算经》中出了一道"百钱买百鸡"的问题,题意是:五文钱可以买一只公鸡,3文钱可以买一只母鸡,1文钱可以买3只雏鸡,现在用100文钱买一百只鸡,那么各有公鸡、母鸡、雏鸡多少只?思路分析1:百钱买百鸡问题,公鸡五文钱1只,母鸡3文钱一只,小鸡1文钱3只,问100元买100只鸡, 各有公鸡、母鸡、雏鸡多少只?假设买公鸡x 只,买母鸡y 只,买小鸡z 只,那么根据已知条件列方程,得出:(1)、 x+y+z=100 //计算鸡的数量,公鸡x+母鸡y+小鸡z =100只鸡(2)、 5x+3y+Z 3 =100 或者写成 5x+3y+13z=100 //计算100元能买多少只鸡 说明:根据题意小鸡1文钱3只,表达式中13 z 也就是Z 3,只是写法不同,都是表示一只鸡要多少钱?(3)、 z=100-x-y //计算小鸡的数量把以上3个公式整理后得到:5x+3y+100-x-y 3=100 然后整个公式都乘以3后: 3×5x+3×3y+3×100-x-y 3=100×3 计算后得到: 15x+9y+100-x-y=300把左边式子整理得到: 15x-x +9y -y +100 =300把左边式子X 和Y 减去得到: 14x+8y+100=300把左边整数放右边,整理得到: 14x+8y=300-100计算后得到: 14x+8y=200继续整理公式,都除以2后:14x 2 +8y 2 =2002计算后得到: 7x+4y=100根据上面公式得到y 整理得到:4y=100-7x然后整个公式都除以4后: 4y 4 = 100-7x 4整理得到y(母鸡数量)的公式:y = 100-7x 4;从右边式中看出4和100都是4的倍数: 这样拆分写是为了让读者通俗易懂: y =1004 - 7x 4 整理公式得到: y =25-74 x 也可以写成 y =25-7x 4由于y 是表示母鸡数量,它一定是自然数(自然数是整数(自然数包括正整数和零),但整数不全是自然数,例如:-1 -2 -3......是整数 而不是自然数。
多种解法求百钱百鸡问题
学号: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.结束,程序输出结果后退出。
java代码练习
java代码练习/** 百钱买百鸡*/public class Chook {/*** 百钱买百鸡*/public static void main(String[] args) {int way = 1; //买法int k = 0; //雏鸡数for(int i=1;i<=20;i++){ //公鸡数for(int j=1;j<=33;j++){ //母鸡数k = 100-i-j; //一共100只鸡if(k%3 == 0 && (5*i+3*j+k/3 == 100)){//雏鸡数是3的倍数,总计100文钱System.out.print("[买法" + way++ + "] ");System.out.println("公鸡: " +i+ " 母鸡:" +j+ " 雏鸡:" +k);}}}}}/** 打印9*9乘法表*/public class Multiplication {public static void main(String[] args) {int i, j; // 循环变量for (i = 1; i <= 9; i++){ // 外层循环控制被乘数for (j = 1; j <= i; j++){ // 内层循环控制乘数System.out.print(i+"*"+j+"="+(i*j)+"\t");}System.out.println(); // 打印一行后换行}}}/*** LookPrice.java 根据编号显示对应的商品价格*/public class LookPrice {public static void main(String[] args) {String name = ""; // 商品名称double price = 0; // 商品价格int goodsNo; // 商品编号/* 打印产品清单*/System.out.println("*****************************************" );System.out.println("请选择购买的商品编号:\n");System.out.println("1.T恤 2. 网球鞋 3. 网球拍");System.out.println("****************************************\n ");Scanner input = new Scanner(System.in);String answer = "y"; // 标识是否继续while (answer.equals("y")) { // con的值为"y"时执行循环体System.out.print("请输入商品编号:"); // 提示输入商品编号goodsNo = input.nextInt(); // 从键盘获取商品编号switch (goodsNo) {case 1:name = "T恤";price = 245;break;case 2:name = "网球鞋";price = 570;break;case 3:name = "网球拍";price = 320;break;}System.out.println(name + "\t" + "¥" + price); // 输出商品名称和价格System.out.print("\n是否继续(y/n)");answer = input.next(); // 用户再次输入是否继续的信息}System.out.println("\n程序结束!");}}/*** LoginMenu.java 购物菜单选择*/public class LoginMenu {/*** 显示我行我素购物管理系统的登录菜单*/public static void main(String[] args) {System.out.println("\n\n\t\t\t欢迎使用我行我素购物管理系统1.0版\n\n");System.out.println("\t\t\t\t 1. 登录系统\n\n");System.out.println("\t\t\t\t 2. 退出\n\n");System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");System.out.print("请选择,输入数字:");/* 从键盘获取信息,并执行相应操作---新加代码*/Scanner input = new Scanner(System.in);int num = input.nextInt();switch (num) {case 1:/* 显示系统主菜单*/System.out.println("\n\n\t\t\t\t欢迎使用我行我素购物管理系统\n");System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");System.out.println("\t\t\t\t 1. 客户信息管理\n");System.out.println("\t\t\t\t 2. 购物结算\n");System.out.println("\t\t\t\t 3. 真情回馈\n");System.out.println("\t\t\t\t 4. 注销\n");System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");System.out.print("请选择,输入数字:");break;case 2:/* 退出系统*/System.out.println("谢谢您的使用!");break;default:System.out.println("输入错误。
“百钱买百鸡”问题的C语言算法分析
“百钱买百鸡”问题的C语言算法分析Abstract:As a process-oriented programming language,C programming language is one of the most classic and popular computer programming languages with the characteristics of the assembly language and the high-level language.It is not only the first choice for the people who begin to learn computer programming,but also the basis for other computer courses and software development.As a difficult point in C Programming Language learning,the loop statement can be used to solve many practical problems of regularly repetitive operation.Taking the case of "spending 100 dollars on 100 chickens",the paper implements design,analysis and optimization,and finally proposes the optimal algorithm.Keywords:C programming language;loop statement;spending 100 dollars on 100 chickens1 引言(Introduction)计算机算法设计是计算机专业学习的核心专业内容,算法设计对于培养一个人的逻辑思维能力具有重要的作用,能进行有效的算法设计是对一个计算机学者的基本要求。
百鸡百钱问题及其算法分析
百钱百鸡问题的最佳解决方案(陕西师范大学计算机科学学院10级计科一班西安 710062)摘要:本文主要讨论百鸡百钱问题,通常用蛮力法策略,用枚举法表现,排除明显不合理情况,列举出符合问题的解,分别验证解的可行性,得到最优算法。
关键词:蛮力法;枚举;百鸡百钱;The money the chicken question the best solutionduan 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问题描述百钱百鸡问题。
求解“百钱百鸡”问题的最优化算法
题意要求用 100 钱买 100 只鸡,若全买公鸡最多买 20 只,显然 x 的值在 0-20 之间;同理, y 的值在 0-33 之间, z 的值在 0-100 之间。 因此, x、y、z 可能的组合方式有 21*34*101=72114 种,对每一种组合方式, 再测试是否符合“百钱、百鸡”这两个条件;若符合,则该组合就是 问题的一个解。 上述思想可编写 MATLAB 程序如下: clc; clear all; for cock=0:20 for hen=0:33 for chicken=0:100 if (5*cock+3*hen+chicken/3==100)&&(cock+hen+chick en==100) [cock,hen,chicken] end end end end 对于上述求解我们称为算法 1,该算法在一般的教科书中都有陈 述, 很明显该算法的时间复杂度为, 最内层的 if 语句被执行了 72114 次。 在答案仅有 4 中组合的情况下,将有 72110 次是无意义的重复执行, 极大浪费了系统资源。
2 现行的求解算法
现行的求解算法主要有两种, 一种是利用三重循环结构来实现的,面的数学分析。 设鸡翁、鸡母、鸡雏的个数分别为 x、y、z, 由题意可得到下面的 方程组:
理论研究
219
求解“百钱百鸡”问题的最优化算法
苏 琳 ( 山东科技大学 土木工程与建筑学院 , 山东 青岛 266000 )
摘 要:“百钱百鸡”问题是一个经典的穷举问题,虽然该问题比较简单,但是目前的算法并没有实现求解过程的最优化。本文充分利用数学 模型中的隐含条件,减少未知量的个数,有效控制循环变量的范围与步长来优化循环次数,最终循环执行 4 次即可求解,使得算法的时间复杂 度从降为,达到算法的最优化,为穷举类问题的求解提供一种新的思路。 关键词:穷举算法;百钱百鸡;优化;Matlab DOI:10.16640/ki.37-1222/t.2018.01.197
c语言百钱买百鸡问题
百钱买百鸡问题一一一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少〕 .这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x, y, z,问题化为三元一次方程组:5x 3y - z/3 =100〔百钱〕'x +y +z =100〔百鸡〕这里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 , v, z /*公鸡、母鸡、小鸡的只数*/初始算法1.初始化为1;2.计算x循环,找到公鸡的只数;3.计算y循环,找到母鸡的只数;4.计算z循环,找到小鸡的只数;5.结束,程序输出结果后退出.算法细化算法的步骤1实际上是分散在程序之中的,由于用的是for循环,很方便的初始条件放到了表达式之中了.步骤2和3是根据步长1去寻找公鸡和母鸡的个数.步骤4的细化4 . 1 z = 14 . 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=78cock=8,hen=11,chicken=81cock=12,hen=4,chicken=84对于这个问题实际上可以不用三重循环,而是用二重循环,由于公鸡和母鸡数确定后, 小鸡数就定了,即z=100-x-y.请同学们自己分析二重循环和三重循环的运行次数,做为练习自己调试这一方法.。
算法经典问题系列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实验习题实验一
#include<stdlib.h>
#include<time.h>
inta;
srand((unsigned)time(NULL));
a= rand()%100;//确保随机数在100以内,可以自己调整
(9)砝码称重:设有1g、2g、5g、10g、15g、20g的砝码各若干枚(总重量≤1000),计算用这些砝码能称出的不同重量的个数,不包括一个砝码也不用的情况即0不算。
输出格式:
在一行中输出处理意见:若属于正常行驶,则输出“正常行驶”;若应处罚款,则输出“超速x%,罚款200”;若应吊销驾驶证,则输出“超速x%,吊销驾照”。其中x是超速的百分比,精确到整数。
(8)从键盘输入一个整数,判断它是奇数还是偶数,输出判断结果。
(9)输入一个正整数,判断是否能被5和7整除,若是,输出YES,若否,输出NO。
(6)统计单词
输入一行字符,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。最后输入回车表示程序结束。
(7)输出一个整数的各位数字
从高位开始逐位输出它的各位数字。
(8)猜数字游戏算法设计,假如已有被猜数在a中,输入一个猜的数字放于b中,若b与a相等,则游戏结束,并输出“恭喜您猜对了”与猜测次数;若b大于a,则输出“您输入的数字太大”,再次输入一个猜的数到b中继续猜数;若b小于a,则输出“您输入的数字太小”,再次输入一个猜的数到b中继续猜数。反复猜直到猜对为止。
area*area = s(s-a)(s-b)(s-c)其中:s = (a+b+c)/2
(3)判断数的符号
输入整数x,若x大于0,y=1;若x等于0,y=0;否则,y=-1,最后输出y。
Scratch趣味数学之百元买百鸡
Scratch趣味数学之百元买百鸡作者:陈新龙来源:《电脑报》2020年第20期我正在研究一道数学题,古代数学家张丘建在《算经》中的百元买百鸡问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,一百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?公鸡五元一只,母鸡三元一只,小鸡一元三只,现有一百元要买一百只鸡可以有几种买法?“百鸡问题”在世界上首次提出三元一次不定方程及解法,也是经典的奥数题目。
如果手工计算的话就算知道解法也不容易,但用Scratch编程用穷举法来解这道题目的话,就显得简单直接了。
编程之前我们先在草稿纸上根据题目写出不定方程。
设X:公鸡Y:母鸡Z:小鸡则X+Y+Z=100(只)5X+3Y+Z/3=100(元)為了编程时控制总运算量,先根据总价100元估算公鸡、母鸡、小鸡的数量范围,公鸡的数量不能超过20只,母鸡的数量不超过33只,小鸡的数量不超过100只,在做题之前我们先把这些关系整理清楚,就方便多了。
算法代码核心部分如图1。
设定四个变量,其中三个变量分别对应公鸡、母鸡、小鸡,还有一个变量对应列表值(目的是为了进行列表输出)。
因为方程的解不唯一,还要设定三个列表存储方程的解。
定义公鸡、母鸡、小鸡的初始值要分别在各自循环前定义,并且不要忘记在每次循环结束前对公鸡、母鸡、小鸡的数目增加1,利用三重循环嵌套进行穷举计算,最终获得结果。
之前我们已经分析了公鸡、母鸡、小鸡的取值范围,相当于确定了程序循环范围,也就是公鸡循环20次,母鸡循环33次,小鸡循环100次,3层循环嵌套,在最里层判断如果X+Y+Z=100与5X+3Y+Z/3=100成立,即获得一组解,每获得一组解将“鸡的列表值”加1,将X、Y、Z数字存入列表相应位置,当循环完成后就可以获得全部解了(如图2)。
外观方面可以像我一样增加一些对话环节,大家可以在网盘下载源代码参考。
百钱买百鸡我们用到了穷举法(枚举法),所谓穷举法,顾名思义就是穷尽每一种可能性,通常在找不到解决问题的规律时对可能是解的众多候选解按照某一顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。
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~333) 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 =14.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=78cock=8,hen=11,chicken=81cock=12,hen=4,chicken=84对于这个问题实际上可以不用三重循环,而是用二重循环,因为公鸡和母鸡数确定后,小鸡数就定了,即y100z 。
Java—作业与练习
1. 求解经典的“百马百担”问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?
2. 编程求解古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。
百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
3.编写余切公式求解待定点坐标的程序。
一个三角形中已知A 、B 点的平面直角坐标和A 、B 两点内角观测值计算待求点P 平面坐标的公式如下:
要求:(1)程序中以变量赋初值的方式给定A 、B 两点坐标及内角观测值(角度以十进制度为单位),输出时要输出已知值、观测值及待定点P 的坐标。
(2)有良好的代码书写风格。
ctg ctg ctg ctg A
B A B p x x y y x βααβ+-+=+ctg ctg ctg ctg A B A B p y y x x y βααβ
++-=+。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)编写和运行一个小应用程序的过程 第一步:打开记事本,编写源代码。 第二步:另存为:文件名和 public 类名相同,后缀改为.Java,保存类型改为所有文件。 第三步:再打开一个记事本,在里面编写 html 并把 Java 小应用程序嵌入,文件名改为*.html 第四步:开始->运行->cmd,打开 dos 界面 第五步:用 cd 命令进入源文件所在目录,运行命令 javac *.java 会生成 .class 文件 第六步:运行 appletviewer *.html 或者直接打开 html 页面
" 只母鸡" + x + " 只小鸡"); break;
} }} }
图 1-2 百钱白鸡问题
5.实验总结
这次的实验我了解了 java 程序的输入输出方法,同时也了解了应用程序与小应用程序的不同, 实验过程中,我出现了错误,在文本文档中我我用中文的分号,有时也会少写结尾的“}”致 使我的程序编译时出现错误,同时我也知道改正完错误后,要重新编译源程序,另外一定要找 到源程序再编译,否则会出现源程序文件不存在的问题。
} } 实验结果为:
图 1-1 求平行四边形面积 编写程序:“百钱百鸡”问题。即母鸡五钱一只,公鸡三钱一只,小鸡一钱三只,现有百钱预买百鸡, 共有多少种买法: 程序代码为: import java.io.*;
2
Java2 程序设计实验报告
public class BaiJi{ public static void main(String args[]) { int g, m, x, num = 0; for (g = 0; g <= 20; g++) for (m = 0; m < 33; m++) for (x = 0; x <= 100; x = x + 3) { if ((g + m + x == 100) && (g * 5 + m * 3 + x / 3 == 100)) { num++; //System.out.println(num); System.out.println("第" + num + " 种方法为:" + g + " 只公鸡" + m +
(3)程序源码及运行结果 从键盘输入平行四边形的底和高,求面积并输出: 源程序:
1
Java2 程序设计实验报告
import java.io.*; import java.util.*; class GetArea{
public static void main(String args[]) { Scanner scan=new Scanner(System.in); double length=0.0,height=0.0,area=0.0; System.out.println("请输入平行四边形的底:"); length=scan.nextFloat(); System.out.println("请输入平行四边形的高: "); height=scan.nextFloat(); area=length*height; System.out.println("平行四边形的面积为:"+area);
4.实验步骤
(1)(1)编写和运行一个应用程序的过程 第一步:打开记事本,编写源代码。 第二步:另存为:文件名和 public 类名相同,后缀改为.Java,保存类型改为所有文件。 第三步:开始->运行->cmd,打开 dos 界面 第四步:用 cd 命令进入源文件所在目录,运行命令 javac *.java 会生成 .class 文件 第五步:运行 java *
Java2 程序设计实验报告
实验一 熟悉 Java 环境
班级 姓名 学号
日期 (2)掌握应用程序(Application)和小应用程序(Applet) (3)掌握 Java 程序的开发过程
2.实验环境
JDK+记事本
3.实验内容
(1)熟悉实验环境,熟悉 java 的运行机制,调试一个应用程序和小应用程序 (2)编写程序:从键盘输入平行四边形的底和高,求面积并输出 (3)编写程序:“百钱百鸡”问题。即母鸡五钱一只,公鸡三钱一只,小鸡一钱三只,现有百钱预买 百鸡,共有多少种买法