问题:公鸡5块钱一只,母鸡3块钱一只,小鸡一块钱3只,现在有100块钱购买100只鸡,请问可以买多少只公鸡、多少只母鸡、多少只小鸡?
解题思路:
依据题目提供的线索我们可以知道:
如果100块钱只买公鸡可以买20只,那么公鸡的取值范围在0——20之间。
如果100块钱只买母鸡可以买33只,那么母鸡的取值范围在0-——33之间。
1. 公鸡+母鸡+小鸡 = 100 (100块钱可以买公鸡、母鸡和小鸡)
2.5x公鸡 + 3x母鸡 + 小鸡/3 = 100
思路1:
1.第一层循环遍历100块钱购买公鸡的数量20只.
2.第二层循环遍历100块钱购买母鸡的数量33只.
3.第三层循环遍历小鸡数量范围(0-100)
public class Lesson1 { public void test() { int cock, hen, chicken; for (cock = 0; cock <= 20; cock++) { for (hen = 0; hen <= 33; hen++) { for (chicken = 0; chicken <= 100; chicken++) { boolean cond1 = 5 * cock + 3 * hen + chicken / 3 == 100; boolean cond2 = cock + hen + chicken == 100; boolean cond3 = chicken % 3 == 0; if (cond1 && cond2 && cond3) { System.out.printf(String.format("公鸡 = %d,母鸡=%d,小鸡=%d\n", cock, hen, chicken)); } } } } } public static void main(String[] args) { Lesson1 lesson1 = new Lesson1(); lesson1.test(); } } 运行结果 公鸡 = 0,母鸡=25,小鸡=75 公鸡 = 4,母鸡=18,小鸡=78 公鸡 = 8,母鸡=11,小鸡=81 公鸡 = 12,母鸡=4,小鸡=84
不难发现,上面的解题思路采用了3层循环,这样会导致计算时间过长,那么接下来我们优化一下,依照题目我们可以知道单纯购买可以买公鸡20只,母鸡33只,那么第三层循环就可以直接使用100-公鸡-母鸡=小鸡,因此优化算法如下:
public class Lesson2 { public void test() { int cock, hen, chicken; for (cock = 0; cock <= 20; cock++) { for (hen = 0; hen <= 33; hen++) { //剩下的是小鸡的数量 chicken = 100 - hen - cock; boolean cond1 = 5 * cock + 3 * hen + chicken / 3 == 100; boolean cond2 = chicken % 3 == 0; if (cond1 && cond2) { System.out.printf(String.format("公鸡 = %d,母鸡=%d,小鸡=%d\n", cock, hen, chicken)); } } } } public static void main(String[] args) { Lesson2 lesson2 = new Lesson2(); lesson2.test(); } }
最后,我们是否能够根据数据计算只使用一次循环来实现呢?
实际上也就是需要手动的化繁为简,求解3元一次方程组
cock + hen + chicken = 100
5cock + 3hen + (1/3)chicken = 100 → 消除chicken分母,多项式两边都乘以3 得出
15cock + 9hen + chicken = 300 ,方程组3元化2元求hen的值(减去cock + hen + chicken = 100)得到
14cock + 8hen = 200, 最终hen = 25-(7/4)cock。同理,算出小鸡chicken = 75+(3/4)cock.
目前为止算出的结果如下
hen = 25-(7/4)cock
chicken = 75+(3/4)cock
因此我们的算法可以更进一步简化,把cock带入到for循环体内即可
public class Lesson3 { public void test() { int cock, hen, chicken; for (cock = 0; cock <= 20; cock++) { hen = 25 - (7 * cock) / 4; chicken = 75 + (3 * cock) / 4; if (hen > 0 && chicken > 0) { boolean cond1 = 5 * cock + 3 * hen + chicken / 3 == 100; boolean cond2 = chicken % 3 == 0; if (cond1 && cond2) { System.out.printf(String.format("公鸡 = %d,母鸡=%d,小鸡=%d\n", cock, hen, chicken)); } } } } public static void main(String[] args) { Lesson3 lesson3 = new Lesson3(); lesson3.test(); } } 运行结果 公鸡 = 0,母鸡=25,小鸡=75 公鸡 = 4,母鸡=18,小鸡=78 公鸡 = 8,母鸡=11,小鸡=81 公鸡 = 12,母鸡=4,小鸡=84
总结,同一个问题有不同的解决方法,如果能用最优的方法达到更高的执行效率是指的花时间去调整的。程序设计不仅仅是一门技术,更是一门艺术。第三种方案循环执行了20次,有没有更优的方法来减少循环的次数呢? 答案当然是肯定有的,不知道读者有没有发现每次执行的结果只有4条,那么是不是意味着我们只需要执行4次呢? 如何优化的问题请读者思考一下吧,本篇文章只是趣味算法的入门课,后面会持续更新,希望喜欢
相关推荐
百钱百鸡问题,又称“鸡兔同笼”问题,是中国古代经典的数学问题之一,源自《孙子算经》。在编程领域,这是一个典型的线性方程组求解问题,可以通过循环、递归或数学公式来解决。在C#中,我们可以使用循环结构,如...
蛮力法解决百钱百鸡问题的C语言实现 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”: 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一, 百钱买百鸡,问翁、母、雏各几何? *题目分析与算法设计 设鸡翁、鸡母、鸡雏的个数分别...
【标题】"Java百钱百鸡问题"是一个经典的数学与编程问题,源于中国古代的一个算术题目,也称为“鸡兔同笼”问题的变种。在这个问题中,我们需要使用编程来解决一个组合优化问题:假设鸡的价格是1元,鸡蛋的价格也是1...
C++1022 - 百钱百鸡问题
C程序设计:百钱百鸡问题
python05Day 构造程序逻辑-百钱百鸡问题.py
"百钱百鸡问题",又称为“鸡兔同笼”问题,是中国古代经典的数学问题之一,主要涉及到了基础的代数和逻辑推理。在C语言中,我们可以通过编程来解决这个问题。这个问题的基本设定是:假设鸡的价格是1元钱一只,兔子的...
函数实现类似百钱百鸡问题_2022080912028_20230422231410.cpp
百钱买百鸡问题,分别使用for循环还有while循环编写
【百钱百鸡问题】是古代数学中的一种经典问题,涉及到用有限的货币购买不同价格的商品,使得商品总数达到一定值。在这个问题中,鸡翁(公鸡)的价格是5文钱,鸡母(母鸡)是3文钱,而鸡雏(小鸡)3只合计1文钱。目标...
给你一百元钱,让你买一百只鸡,有公鸡母鸡和小鸡
《C++实现“百钱百鸡”问题》 在编程世界里,经典的“百钱百鸡”问题(也称为“鸡兔同笼”问题)是一个常见的逻辑与算法练习,它源自中国古代的一道数学题。本教程将通过C++语言来探讨如何解决这个问题。 “百钱...
在编程领域,尤其是在算法设计和问题解决中,经常会遇到经典的数学问题,比如“百钱买百鸡”问题。这个问题源自古代中国,是一个典型的组合优化问题,通常用来考察人们的逻辑思维和编程技巧。在这个C#的循环练习中,...
java中常用的一些小程序百钱买百鸡,java小程序
这个是算法设计实验中的一个代码设计问题,代码很好用,用VC就可以运行
百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡百钱买百鸡
百钱百鸡问题,又称鸡兔同笼问题,是中国古代著名的数学问题之一,它涉及到整数解的问题。在C#编程中,我们可以用各种方法来解决这个问题,这为我们提供了理解算法和逻辑思维的一个良好实践场景。 百钱百鸡问题的...
"百钱买百鸡"问题就是这样一个有趣的经典例子,它源于中国古代的数学文献,具有丰富的历史背景和教育价值。在这个问题中,我们需要使用有限的资源(100枚钱)购买三种不同价格的鸡(公鸡、母鸡和小鸡)。每种鸡的...
百钱百鸡问题 很详细 简洁易懂的 有注释说明的