新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V5.9版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 849|回复: 2

[微课] 7137 - 新大榭微课№:001 - 【案例】百钱百鸡问题(公开课)

 关闭 [复制链接]
发表于 2021-3-3 21:30:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

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

x
百钱百鸡是我国古代数学家 张丘建 在《算经》一书中提出的数学问题:
1 E# n) C& w0 S, Q鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。
0 b6 _/ c: w! s百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

(*)注:本题出自浙江省普通高中《信息技术》(必修一)P100页第6题   →【传送门】
  1. 温馨提示:该传送门需要一星及其以上会员才能正常显示!
复制代码
翻译成现代文是:" l. Y2 }( ?& W2 O
公鸡5元一只,母鸡3元一只,小鸡1元三只;) f/ A- R* K; z- Y( ^( O- d
请问用100元买一百只鸡,那么公鸡、母鸡、小鸡各有多少只?
. `9 ]9 j" K* `# ^5 ?
题目要求总共买 100 只鸡,由此可知,所买公鸡的数量肯定在 0~20 之间;7 o; F. ^, I) C! k4 i- _2 ^6 y% L
5 x" c( y% g+ `+ D( ]) E
同理,母鸡的数量在 0~33 之间;# }5 V3 ~4 O) `- ~8 ~

/ ?0 j) f" d) K5 O7 E& n* ?9 K& x创建变量 cock 代替公鸡,hen 代替母鸡,chicken 代替小鸡;; ], q* S$ h3 `& G% b
# b. F) k0 f" \2 H  M0 @- p
那么 cock+hen+chicken == 100,将百钱买百鸡问题就转化成解方程组。
* }4 R; A9 }8 X1 N( x2 A" P% c$ K: @& i7 {" q- }  [+ O% q4 y
一旦可以写成公式,那么就可以用程序来代替。# y/ H; x- T4 u

, E$ q  F- n: s$ c% f: B* u5 W. `除了上面的条件,还有保证价格之和为100元:cock*5 + hen*3 + chicken/3 == 100' L, ~6 |$ W( l' S9 K; p$ U6 ~( Z# @; k
/ j$ w5 E" `* X8 I; w7 ?# E
对于方程组,最简单粗暴的方式就是用 穷举循环 的方法来解决!. H$ F1 A6 \$ r3 k3 u/ }

5 B7 A1 l1 l$ n4 t7 J反正计算机最擅长的“傻算”,呵呵~3 l8 P! H. \$ @$ k3 R

/ K- v5 I8 n+ r/ ^通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。
, V7 h* O3 n$ q2 ^
- n* N* V9 M1 J- f# `% Ecock 的取值范围是 0~20,可用以下循环语句实现:
3 \4 T- N8 c2 u
# i2 d8 T- W7 G
  1. for cock in range(0,21)
复制代码

4 N& t5 D; R0 v/ j8 z
钱的数量是固定的,要买鸡的总数量也是固定的!. {8 P; G+ G1 u" ~

" ^2 [/ ~; j& D" _, i4 ?既然穷举完公鸡,就在其基础上穷举母鸡,然后再在其基础上再穷举小鸡。. T  W) B8 b$ q+ c0 O& E
) e+ [( ]  c5 u5 _3 Q" z1 Y6 T/ X
每一次都傻算就好,我们可以利用三层循环的嵌套来解决:' @$ O& Y1 u& G) ]3 b
6 d* B  v) {4 _' a' R% ~/ L
  • 第一层循环控制公鸡的数量
  • 第二层控制母鸡的数量
  • 最内层控制小鸡的数量
    ! V" R+ t3 H/ ^

+ R, q6 j( z. z" B: E+ g5 E; R+ R% f) M
每层循环的初值是 0(即买的 100 只鸡中,可能没有公鸡,也可能没有母鸡或小鸡)
& O+ ^( z8 |' Y( Q/ [8 K- O6 Z( s1 F7 F. u3 m2 `- y
循环的控制条件就是公鸡、母鸡和小鸡用百钱分别最多能够买到的数量!2 ]. ~- i# i: B9 U5 s3 \( `0 e$ U* J
; X' a$ y: P% ^
公鸡最多 20 只,母鸡最多 33 只,小鸡最多 100 只。
* v" A2 Y& S6 ?1 E2 a/ A2 h) T$ G2 k+ o5 T& A! c  d: D# d! B
穷举循环的特点就是把所有情况都考虑到,因此每层循环执行一次,对应循环变量的值就要加 1
$ A& q6 g' U2 Q6 N5 J+ G9 u; D# e5 H0 u1 f6 K0 C
很傻很粗暴的循环就好,很方便理解对吧!  D% a- H* c, K+ A

( E. O) R4 {7 z. F$ v, M2 r5 a↓↓↓ 化成流程图就是:(点击查看大图)
% t8 U) j& y) A* o6 h& B3 j  m, a, U" L4 ?) p
7137_01.jpg ( t1 C6 l# M, m* E
6 @. U( M4 Y1 |* J- T
根据流程图,构建程序框架,编写代码如下:$ r* [, m& s9 c( l5 O( ?# W
  1. # -*- coding: utf-8 -*-
    . U+ E8 i& F4 c- v- j  N
  2. """
    # [3 p  q* n2 Q0 S: x" \
  3. @Team: 新大榭论坛
    6 ]& G! p8 N: }* ~( {5 _
  4. @Author: 张黎斌1 @2 K* f8 f' E3 O/ P$ {3 v
  5. @update: 2021-07-25  @* v5 b7 F  C4 Y3 z9 c; T
  6. @Version: v1.1* @. O. E. C$ y, [# R9 I
  7. @BBSid: 7137
    0 }$ D5 e; Q; f% R
  8. @Level: A
    , _- `( }  ^2 r0 c+ n2 j' X
  9. ---------------------------1 {( `' c  b+ B: i$ r7 W) h
  10. 古代经典《百钱百鸡》问题
    * l( x4 S' D& L* R: F2 B
  11. ---------------------------" y0 x& |" S6 b. ?; g5 P8 m

  12. ) u# x4 _! j) Y: F- N! x
  13. """
    " a7 ^3 _4 T! K
  14. print("+----------------------------------------------------------+")
    ; j1 o0 h' j( q. |
  15. print(">>> 新大榭Python文件启动程序(py文件双击) V1.2.21.0727 ")
    0 w$ d, f" l4 p- F0 G0 s+ E
  16. print("+----------------------------------------------------------+")) Y- e/ V3 o( M% G) K4 N
  17. print(">>> 新大榭Web实验室 http://lab.daxie.net.cn/ ")
      g5 e* L. h; N7 J7 W
  18. print("+----------------------------------------------------------+")
    # u- I  e/ ~8 \- @5 f
  19. print("↓↓↓ 古代经典《百钱百鸡》问题")3 ^' H5 v6 d; u% Y/ J3 I6 H1 e0 Z
  20. print("+----------------------------------------------------------+")7 r5 R# ~4 P+ ^# j9 t

  21. 6 @: {6 D$ J$ S) |' m6 I
  22. # 以下为主程序核心代码 ↓↓↓
    & \7 [. Z4 \1 z2 j+ d

  23. 5 s) e2 j5 ?) g" ?  j; O- }# E
  24. cock = 0" U; V. z9 M3 R
  25. while cock <= 20:
    & X6 g$ a! g* ?
  26.         # 内层循环控制母鸡数量取值范围为0~339 y/ z6 H6 I8 m2 i4 D
  27.         hen = 0$ V* h/ H/ H5 D; @5 Y& n9 g
  28.         while hen <= 33:/ u) u4 ]" f% D3 _2 p
  29.             # 内层循环控制小鸡数量取值范围为0~100
    % u+ R) z$ n' V% `6 v
  30.             chicken = 02 Y+ R/ N6 V! k
  31.             while chicken <= 100:' ^) {- |! g; N3 f6 b
  32.                 # 条件控制
    , _! n. g2 N3 ]/ ~/ e
  33.                 if (5 * cock + 3 * hen + chicken / 3.0 == 100) and (cock + hen + chicken == 100):
    , b. p$ Z+ p; a' X
  34.                     print("cock=%d,hen=%d,chicken=%d\n" % (cock, hen, chicken))
    ) g) T: z; E$ y* k8 y( d1 |
  35.                 chicken += 1! n# \1 _" t9 g6 {
  36.             hen += 1, U8 ~2 K/ M; {) ~
  37.         cock += 1 + i9 P! j: t4 h# \: b! ?4 x
  38. % O! P1 s3 E; N% B  y) Z/ y
  39. # ↓↓↓ 以下代码优化与答题无关,可屏蔽IDLE程序意外退出!
    / m4 ]; Y& o3 S8 k1 Q
  40.   H: I% F5 W: D
  41. print("┏----------------------------┓")' i. f' t- ]$ L- @- }9 q6 P
  42. print("┣--- 按下回车键即退出程序 ---┫")
    ( _! Z7 g" m) N7 J
  43. print("┗----------------------------┛")
    2 m9 `6 T) ?7 X" x( Q+ A7 o
  44. input(">>>")
复制代码
, Z% D- R7 v& `
  好了,课间休息十分钟吧,咱们稍后回来 ...

7137_例1.zip

843 Bytes, 下载次数: 95, 下载积分: 财富 -1 点

课件源代码 - while循环

新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
 楼主| 发表于 2021-7-18 07:53:16 | 显示全部楼层

- j8 X- _  B  P好了,接下来我们开始继续咯!; A8 _: ]; N3 L
% g, s" U7 ?4 r% D
同学们,老师在上一节课中使用了 while 循环语句进行穷举,2 L% K+ ?9 U( w( y( V

" M, [4 O; Z- I% ?" Y6 X, F那同学们知道用while本题共要穷举多少次吗?(此处应该有举手)6 O# T/ Y8 G, s3 C# }, ^; o4 g
0 R, P# F* e$ {" Q- o0 D" m
没错,以上算法需要穷举尝试共 21×34×101=72114 次,算法的效率显然可以再优化!
; n3 W: z, v' ~+ i+ Z9 X  e9 P3 ]- Y/ T, w) O% m  G( Q
对于本题来说,公鸡和母鸡的数量确定后,小鸡的数量就可以确定为 100-cock-hen,无须再进行穷举了!4 B9 C  h" `7 ?# [8 a
7 Q# q8 l& I+ J* y+ Z* A; D6 L' T
此时约束条件也只有一个,即 5×cock+3×hen+chicken/3==1001 k  N. X7 |/ }% D
  y! s! D1 W: m/ R: C0 [
思路框架有啦,具体敲代码就轻松了,代码如下:

$ p" w3 \9 `2 g2 `4 H
  1. """
    ' N3 ?2 u3 ?/ d! s$ J. ?
  2. Team: 新大榭$ e0 N7 R; i4 d9 f
  3. Author: 张黎斌2 z/ w; u9 [5 f& _! ^- {$ W
  4. update: 2021-07-18/ W% [7 r# \. A% q5 h( p
  5. Level: A
    ; h" S* B7 f! Q. S, B' @5 i2 k

  6. 4 Q; N6 h0 q  Z2 g# J
  7. 古代经典的《百钱百鸡》解法二 for循环+ U0 g: ?* h' V/ `/ |( Y
  8. """4 S5 }; I4 `: j( `3 f
  9. for x in range(0,21):  # x取值范围 0<=x<=20% A  |) v- I$ T$ p/ i& B1 K
  10.     for y in range(0,34):  # y取值范围 0<=y<=33
    . T) \; g0 V2 Q/ r0 `; K
  11.         z = 100 - x - y( p# o( w; q+ }) r' |9 d3 H5 G; ~
  12.         if 5 * x + 3 * y + z / 3 == 100:9 J6 X) h% c# D* F8 l
  13.             print('公鸡: %d只, 母鸡: %d只, 小鸡: %d只' % (x,y,z))
复制代码
上面使用的算法我们称它为 穷举法,也称为 暴力搜索法,这种方法通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,而且问题的解如果存在,这种方法一定能够找到它。
' C3 U6 C; a. Z7 U5 N
总结:方法1采用while循环,方法2采用for循环,通过算法对比,我们不难发现本题方法2更显简洁高效!

7137_例2.zip

784 Bytes, 下载次数: 90, 下载积分: 财富 -1 点

课件源代码 - for循环

新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
 楼主| 发表于 2021-7-18 08:21:09 | 显示全部楼层
最后,我们不仿来看看国内大学校园学哥学姐们对古代经典《百钱百鸡》问题的另类解法:# k) E9 m9 }( c" Z. Z
  1. for cock in range(0,101,5):0 \: N  [! c( g
  2.     for hen in range(0,101 - cock,3):
    ! A; ~) a. Z9 h! i: p
  3.         chicken=100-cock-hen
    & ~0 ]2 s0 u- X) r. S( p) R, M
  4.         if cock/5+hen/3+chicken*3==100:
    0 b" K' A. z5 v, i  ]8 x
  5.             print("cock=%d,hen=%d,chicken=%d"%(cock/5,hen/3,chicken*3))
复制代码
比如这样:
- i, ?- e" `9 |* o
  1. cock, hen, chick = 0, 0, 0    #数量
    1 L2 g0 D2 U; W

  2. 1 r" [9 V) ~1 |8 L: r- a8 Q% t; V
  3. for cock in range(0,21):6 A7 O! \4 S( G% t6 _) s! ^3 K
  4.     for hen in range(0,34):
    8 C" A/ g7 Y  B1 M6 j
  5.         for chick in range(100 - cock - hen,101,3):
    % i# P2 a: C5 _: m
  6. * z* c/ X& r2 f/ U* q
  7.             total = cock + hen + chick
    6 L  V3 ~, M: z1 }6 \1 U! X8 |
  8.             total_price = cock*5 + hen*3 + chick/3
    ( ^% X, ]: l, X+ B( S7 `+ j
  9. 0 q6 ?- g" V8 U5 a  G
  10.             if total == total_price == 100:
      f: {6 m* C0 \' X: ]6 Q' S% Z
  11.                 print('cock = %d, hen = %d, chick = %d, 总数 = %d, 总价 = %d'
    . |2 C0 a- e! W! H
  12.                       % (cock, hen, chick, total, total_price))
复制代码
再比如这样:
4 h1 c7 p! m4 L9 T8 Z* V
  1. # Initiate the value" V' Z; J( D' A4 }; V
  2. hen = 0
    7 w3 x* o; y% Z( V0 j6 A
  3. rooster = 0
    9 g$ r$ f4 O9 o6 X* l6 x; d% B/ `
  4. chick = 0( }9 ~6 s* h% v* A1 p
  5. . {  G) c/ Y# K+ h
  6. # start calculating
    5 b# c0 Z: a" ^; v1 H0 i* ~
  7. for rooster in range(21):, [, V' W* h  H  [8 }
  8.     for hen in range(34):
    3 ?! g+ Z! q/ k' a0 A
  9.         if (100 - 3 * hen - 5 * rooster) * 3 + hen + rooster == 100:% _7 x# B3 d, m6 f: z) T' j' [
  10.             chick = 100 - hen - rooster+ c1 U3 v% t: e+ X
  11.             print(f"rooster is {rooster},"
      Q5 G7 z( N1 s
  12.                   f"hen is {hen},"1 U/ y5 Q  {7 M# e! n
  13.                   f"chick is {chick}")
复制代码
总结:条条大道通罗马,希望同学们今后通过对算法不断学习,提升自己编程技能!加油!
预告暑期公益开播第二讲  - 查找女神手机号点击传送门
0 {) t% z5 R" S1 [( q) J
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
北仑单身女神专属群:181567400 北仑单身男神专属群:140788506  平台大数据筛选,勇敢为爱宣告,拒绝骚扰!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新大榭七周年,感谢由您!

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2025-8-21 17:14 , Processed in 0.088182 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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