儿时数学课上的“百钱百鸡”问题我又捡起来了

一 背景介绍

奶奶给了小花100大洋,让她去集市买鸡。

买鸡要求是:既要有公鸡(cock),也要有母鸡(hen),还要有小鸡(chick)。三种鸡缺一不可,不然回家打屁屁。

市场的行情价是:公鸡5块大洋一只,母鸡3块大洋一只,小鸡仔儿嘛1块大洋可以买到三只。

最后小花买了100只鸡高高兴兴回家了,问她三种鸡各买了几只?

这就是有名的“百钱百鸡”问题,下面尝试分别使用枚举法和公式推导法的思想,使用python语言编程来解决这个问题。

二 枚举法来解决

所谓枚举法就是考察问题中的所有情况,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。

如果手算的话,这种方法肯定是要舍弃掉的,因为它太麻烦,效率太低,但是谁让计算的对象是计算机呢,计算机运算速度快、精确度高,它不在乎,因此我们应该学会这种方法,至于具体的计算嘛,实施环节交给计算机就行了!

下面我们就来具体的讨论一下如何具体的实现它

首先要设置三个变量:cock,hen,chick

我们来一一枚举(列举出每一种鸡可能的最少和最多数量),然后使用range()来实现三个变量数量的迭代(左闭右开):

变量minmax
公鸡(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))

运行输出结果和上面一样:

第二种方法在第一种的基础上,通过深入分析数量关系,通过增加更精确的限制条件减少了实际的迭代次数。

虽然问题已经是老生常谈了,但是运用编程知识解决该问题,并且是用不同的方法来完成这个经典案例,在这个过程中的思考便是自主掌握和提高编程知识,达到掌握能力的一个过程,同时也体会到了优化自己代码和解决方案的重要性。

感谢阅读,如果对你有所启发的话就点个赞鼓励一下吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值