鱼C论坛

 找回密码
 立即注册
查看: 14632|回复: 92

[技术交流] 00 - 百钱百鸡【师妹小讲堂】

[复制链接]
发表于 2021-1-27 15:17:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼C-小师妹 于 2021-3-25 10:25 编辑

几个新手总会踩的“坑”|【辛 酸 血 泪】发出后,师兄们的反应还不错。

2021-01-27_15-09-32.jpg

让小师妹继续采用“手写+讲解”形式来讲编程技术。

好吧,既然温柔善良可爱如我,那就安排,噔噔噔,就是:

师妹小讲堂


师妹小讲堂


师妹小讲堂


本系列基于 Python,从最简单算法题目,一步一步深入到力扣 5 星难题!

涉及到的共识,流程图,程序结构等等概念。

小师妹都会边讲边在黑板上画出来,一目了然

而底层的知识,小师妹默认你懂!

不懂,请出门左转看小甲鱼老师的课程:



哈哈哈,想想就是一个艰巨的任务,不过,我喜欢!

还不一键三连,废话不多说,开始!


百钱百鸡

5103537c3755497295d4f22cc30b33bd_th.jpg

中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:

一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?

咱们直接换成软妹币翻译一下:

其中公鸡 5 块一只,母鸡 3 块一只,3 只小鸡算 1 块,要用 100 块钱买 100 只鸡,数量各是多少?

题目要求买 100 只,由此可知,所买公鸡的数量肯定在 0~20 之间。

同理,母鸡的数量在 0~33 之间。

创建变量 cock 代替公鸡,hen 代替母鸡,chicken 代替小鸡。

那么 cock+hen+chicken == 100,将百钱买百鸡问题就转化成解方程组。

一旦可以写成公式,那么就可以用程序来代替。

除了上面的条件,还有价格之和为 100:cock*5 + hen*3 + chicken/3 == 100

对于方程组,最简单粗暴的方式就是用穷举循环的方法来解决!

反正计算机最擅长的“傻算”

通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。

cock 的取值范围是 0~20,可用循环语句实现:

  1. for cock in range(0,21)
复制代码


钱的数量是固定的,要买的鸡的数量也是固定的!

既然穷举完公鸡,就在其基础上穷举母鸡,然后再在其中穷举小鸡。

每一次都傻算就好,我们可以利用三层循环的嵌套来解决:

  • 第一层循环控制公鸡的数量
  • 第二层控制母鸡的数量
  • 最内层控制小鸡的数量

每层循环的初值 是0(即买的 100 只鸡中,可能没有公鸡,也可能没有母鸡或小鸡)

循环的控制条件就是公鸡、母鸡和小鸡用百钱最多能够买到的数量!

公鸡最多 20 只,母鸡最多 33 只,小鸡最多 100 只。

穷举循环的特点就是把所有情况都考虑到,因此每层循环执行一次,对应循环变量的值就要加 1 。

很傻很粗暴的循环就好,很方便理解对吧。

化成流程图就是(详细步骤见视频):

百钱百鸡.jpg

根据流程图,构建程序框架如下:

  1. while cock <= 20:
  2.         # 内层循环控制母鸡数量取值范围为0~33
  3.         hen = 0
  4.         while hen <= 33:
  5.             # 内层循环控制小鸡数量取值范围为0~100
  6.             chicken = 0
  7.             while chicken <= 100:
  8.                 # 条件控制
  9.                 if (5 * cock + 3 * hen + chicken / 3.0 == 100) and (cock + hen + chicken == 100):
  10.                     print("cock=%d,hen=%d,chicken=%d\n" % (cock, hen, chicken))
  11.                 chicken += 1
  12.             hen += 1
  13.         cock += 1
复制代码

在三层循环中,遇到满足 cock+hen+chicken == 100 和 5×cock+3×hen+chicken/3 == 100,则输出。

输出结果:

游客,如果您要查看本帖隐藏内容请回复


源码: chicken.py.zip (594 Bytes, 下载次数: 43, 售价: 8 鱼币)


优化

以上算法需要穷举尝试 21×34×101=72114 次,算法的效率显然可以优化!

对于本题来说,公鸡的数量确定后,小鸡的数量就固定为 100-cock-hen,无须再进行穷举了!

此时约束条件只有一个,即 5×cock+3×hen+chicken/3=100。

思路有啦,具体代码,自己写!
(答案: chicken.py.zip (567 Bytes, 下载次数: 92, 售价: 2 鱼币)

欢迎下方留言正确答案!!

评分

参与人数 2荣誉 +5 鱼币 +7 贡献 +6 收起 理由
睦ちゃん她爹 + 3 + 4 + 3 鱼C有你更精彩^_^
不二如是 + 2 + 3 + 3 加油

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-27 16:26:28 | 显示全部楼层
小师妹又漂亮了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-6 11:30:20 | 显示全部楼层
缺少初始化cock,代码报错。增加cock = 0 后正常运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 1

使用道具 举报

发表于 2021-2-23 17:14:15 | 显示全部楼层
小师妹就是我学习的动力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 19:06:56 | 显示全部楼层
千霜碎岳 发表于 2021-2-23 17:14
小师妹就是我学习的动力

那小师妹给你加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-24 19:36:54 | 显示全部楼层
for cock in range(0,101,5):
    for hen in range(0,101 - cock,3):
        chicken=100-cock-hen
        if cock/5+hen/3+chicken*3==100:
            print("cock=%d,hen=%d,chicken=%d"%(cock/5,hen/3,chicken*3))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-9 19:52:57 | 显示全部楼层
cock, hen, chick = 0, 0, 0    #数量

for cock in range(0,21):
    for hen in range(0,34):
        for chick in range(100 - cock - hen,101,3):

            total = cock + hen + chick
            total_price = cock*5 + hen*3 + chick/3

            if total == total_price == 100:
                print('cock = %d, hen = %d, chick = %d, 总数 = %d, 总价 = %d'
                      % (cock, hen, chick, total, total_price))

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 08:41:21 | 显示全部楼层
# Initiate the value
hen = 0
rooster = 0
chick = 0

# start calculating
for rooster in range(21):
    for hen in range(34):
        if (100 - 3 * hen - 5 * rooster) * 3 + hen + rooster == 100:
            chick = 100 - hen - rooster
            print(f"rooster is {rooster},"
                  f"hen is {hen},"
                  f"chick is {chick}")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 23:13:11 | 显示全部楼层
看完视频过来看看流程,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-14 13:56:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-24 11:03:09 | 显示全部楼层
谢谢师妹带我飞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-13 09:26:33 | 显示全部楼层
初级版
cock=0
while cock <=20:
    hen=0
    while hen<=33:
        chicken=0
        while chicken<=100:
            if (5*cock+3*hen+chicken/3==100) and (cock+hen+chicken==100):
                print('cock=%d,hen=%d,chicken=%d\n' %(cock,hen,chicken))
            chicken+=1
        hen+=1
    cock+=1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-5-21 10:01:01 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-28 19:27:11 | 显示全部楼层
加油!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-7 22:28:57 | 显示全部楼层
谢谢小师妹带我飞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-21 10:44:28 | 显示全部楼层
for x in range(21):
    for y in range(34):
            if 5 * x + 3 * y + (100-x-y) / 3 == 100:
                print(f'公鸡 = {x}, 母鸡 = {y}, 小鸡 = {100-x-y}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-6 19:50:01 | 显示全部楼层
for i in range(20):
    for j in range(33):
        if 5*i+3*j+(100-i-j)/3==100:
            print("公鸡%d只,母鸡%d只,小鸡%d只"%(i,j,100-i-j))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-9 13:45:10 | 显示全部楼层
本帖最后由 fumun 于 2021-7-9 13:54 编辑

写了个简单的,不知道如何
  1. for coke in range(0,21):
  2.     for hen in range(0,34):
  3.         for chicken in range(0,101-coke-hen):
  4.             if 5*coke + 3*hen + chicken/3 == 100:
  5.                 if coke+hen+chicken == 100:
  6.                     print('coke:', coke, 'hen:', hen, 'chicken:', chicken)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-8-3 10:03:53 | 显示全部楼层
我写的for循环行吗
  1. for j1 in range(0,21):
  2.     for j2 in range(0,34):
  3.         for j3 in range(0,101):
  4.             if j1+j2+j3 == 100 and j1*5+j2*3+j3//3 == 100:
  5.                 print("%d公鸡%d母鸡%d小鸡" %(j1,j2,j3))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-4 16:53:11 | 显示全部楼层

#公雞0~20
cock = 0
while cock <= 20:
    #內層循環從0~33(母雞)
    hen = 0

    while hen <= 33:
      #內層循環每次從0~100(小雞)
        chicken = 0

        while chicken <= 100:
            if (5 * cock+3 * hen+chicken / 3.0 == 100) and (cock + hen + chicken == 100):

                print("cock=%d,hen=%d,chicken=%d\n" % (cock, hen, chicken))
               
            
            chicken = chicken+1

        hen = hen+1

    cock = cock+1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 05:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表