3.4 案例9:百钱百鸡
3.4.1 案例描述
现有100钱,公鸡5文钱一只,母鸡3文钱一只,小鸡一文钱3只,要求公鸡、母鸡、小鸡都要有,把100文钱花完,买的鸡的数量正好是100只。求一共能买多少只公鸡,多少只母鸡,多少只小鸡。
分析:这是一道经典的数学问题,可以设公鸡为x只,母鸡为y只,小鸡为z只,那么可以得到如下的不定方程,x+y+z=100, 5x+3y+z/3=100,本案例就可以转化为解不定方程组的问题,求出不定方程组所有可能的解即可。但是怎么通过Python编程实现呢?下面就来学习本节的重点内容循环嵌套和穷举法。
3.4.2 相关知识
3.4.2.1 循环嵌套
6 循环嵌套
所谓循环嵌套是指在一个循环体中嵌入另一个循环。循环嵌套既可以是for循环嵌套while循环,也可以是while循环嵌套for循环,即各种类型的循环都可以作为外层循环,也可以作为内层循环。
当程序遇到循环嵌套时,如果满足外层循环的判断条件,则开始执行外层循环的循环体,而内层循环将被当成外层循环的循环体来执行,然后再通过判断内层循环的判断条件进入内层循环。只有当内层循环执行结束时,才会通过判断外层循环的判断条件,决定是否执行外层循环的循环体。
while循环嵌套语法格式如下。
for循环嵌套语法格式如下。
注意:循环嵌套可能有多层,但建议不要超过两层。
【例3-10】编程实现打印九九乘法表。
分析:本案例可通过循环嵌套实现。首先外层循环控制行数,内层循环控制列数,然后在内层循环中定义变量求积,最后按照i∗j=d的格式输出即可。
本例使用了for循环嵌套来进行编程,读者也可尝试使用while循环嵌套完成九九乘法表的输出。
3.4.2.2 穷举法
穷举法又称列举法,其基本思想是逐一列举问题的所有情况,常用于解决“是否存在”和“有多少种可能”的问题。在应用穷举法时应注意,列举的情况既不能重复也不能遗漏。在Python编程中,穷举法常用循环结构来实现。
【例3-11】鸡兔同笼问题。假设共有鸡、兔30只,脚90只,求鸡、兔各有多少只。
分析:一只鸡有两只脚,一只兔有四只脚,笼中鸡加兔的脚一共90只。设鸡有x只,则兔有30-x只,可列出一元一次方程式2x+4(30-x)=90,求出该一元一次方程的解即可。在Python中,如何通过穷举法来实现呢?鸡和兔的数量都不超过30只,鸡的数量从1循环到30只,并进行条件判断鸡加兔的总脚数是否为90,将满足这个条件的所有情况通过穷举法筛选出来并输出。
代码如下。
3.4.3 案例实现
基本思路:本案例的实现采用穷举法,使用循环嵌套来进行编程。设公鸡的数量为cock,母鸡的数量为hen,则小鸡的数量为100-cock-hen,公鸡、母鸡的数量都不会超过100只,因此设置两层循环。第一层循环中公鸡的数量从1循环到100,第二层循环中母鸡的数量从1循环到100。然后判断公鸡、母鸡、小鸡花费的钱数总和是否满足为100钱,将满足这个条件的所有情况通过穷举法筛选出来并输出。
代码如下。
运行结果如下。
希望读者在本解法的基础上,开拓思路,思考是否还能使用其他方法来编程实现。