一 背景介绍
奶奶给了小花100大洋,让她去集市买鸡。
买鸡要求是:既要有公鸡(cock),也要有母鸡(hen),还要有小鸡(chick)。三种鸡缺一不可,不然回家打屁屁。
市场的行情价是:公鸡5块大洋一只,母鸡3块大洋一只,小鸡仔儿嘛1块大洋可以买到三只。
最后小花买了100只鸡高高兴兴回家了,问她三种鸡各买了几只?
这就是有名的“百钱百鸡”问题,下面尝试分别使用枚举法和公式推导法的思想,使用python语言编程来解决这个问题。
二 枚举法来解决
所谓枚举法就是考察问题中的所有情况,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。
如果手算的话,这种方法肯定是要舍弃掉的,因为它太麻烦,效率太低,但是谁让计算的对象是计算机呢,计算机运算速度快、精确度高,它不在乎,因此我们应该学会这种方法,至于具体的计算嘛,实施环节交给计算机就行了!
下面我们就来具体的讨论一下如何具体的实现它
首先要设置三个变量:cock,hen,chick
我们来一一枚举(列举出每一种鸡可能的最少和最多数量),然后使用range()来实现三个变量数量的迭代(左闭右开):
变量 | min | max |
公鸡(cock)5元/只 | 1 | (100-3-1)//5 =19 |
母鸡(hen) 3元/只 | 1 | (100-5-1)//3 =31 |
小鸡(chick)1/3元/只 | 1 | 100-cock-hen |
列表备注:
虽然chick一只不足1元,但是为了计算简便,我们计算 最多数量 时当成1元,(就算不当成1元,1元中剩下的部分也买不了公鸡和母鸡呀)。
"//"表示地板除(x//y表示x除以y取比目标结果小的最大整数。)
使用for循环来实现
str.format()函数方法是格式化字符串,通过{ }来指定位置,format 函数可以接受不限个参数,位置可以不按顺序,基础用法示例如下:
python代码实现:
# 百钱百鸡---枚举法
# fqy
for cock in range(1,20): #设置变量cock的取值范围,左闭右开,(cock最多19只)
for hen in range(1,32): #嵌套for循环语句,同理设置hen变量的取值范围,左闭右开
chick = 100 - cock - hen #小鸡的数目
if 5*cock + 3*hen + 1/3*chick == 100: #如果三种鸡的数量满足条件,在下面输出,注意缩进
print("公鸡买了{0}只,母鸡买了{1}只,小鸡买了{2}只".format(cock,hen,chick))
#设置变量输出指定的位置
运行输出结果:
问题解决啦!
三 公式推导法来解决
使用枚举法解决该问题的缺点在前面已经提到了,就是迭代次数太多了,可以深入分析问题从而来修改程序来减少迭代次数。切入点就是分析方程组不同未知数之间的数量关系,分析如下:
由此可知,公鸡和母鸡是存在上面的数量关系的,公鸡和母鸡的个数只能是整数,所以cock为1,2,3的情况不成立,从4开始迭代(遍历),并且以4为步长进行循环迭代(这样才能保证母鸡的个数也是为整数)
python实现代码如下:
for cock in range(4,13,4): #从4到12开始迭代,以4为步长
hen = int(25 - (7/4)*cock) #公鸡与母鸡的数量关系,为了使得结果不为浮点数,使用int()
chick = int(100-cock-hen)
print("公鸡买了{0}只,母鸡买了{1}只,小鸡仔儿买了{2}只".format(cock,hen,chick))
运行输出结果和上面一样:
第二种方法在第一种的基础上,通过深入分析数量关系,通过增加更精确的限制条件减少了实际的迭代次数。
虽然问题已经是老生常谈了,但是运用编程知识解决该问题,并且是用不同的方法来完成这个经典案例,在这个过程中的思考便是自主掌握和提高编程知识,达到掌握能力的一个过程,同时也体会到了优化自己代码和解决方案的重要性。
感谢阅读,如果对你有所启发的话就点个赞鼓励一下吧!