问题描述

中国古代数学家张邱建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?

分析

这也是经典问题了,在数学上其实不过就是多元一次方程组。如果用cock代表公鸡的数量,hen代表母鸡,chicken代表小鸡,可列出方程组如下:

如果使用计算机思维,因为数据量小(小于100),完全可以用穷举法,使用三层嵌套循环,从外向内分别代表公鸡、母鸡、小鸡的数量,然后依次判断三者的值是否同时满足上述两个方程。

因为100钱最多可以买只公鸡,只母鸡,只小鸡,所以这三个变量的上限分别是20、33、300。但同时又不能把钱全部用来买公鸡、母鸡、小鸡——因为数量不对,所以取值分别最多为19、32、297(小鸡的数量要能被3整除)于是可编写代码如下:

for cock in range(20):for hen in range(33):for chicken in range(298):if cock+hen+chicken=100 and 5*cock+3*hen+chicken/3==100:print(f"可买{cock}只公鸡,{hen}只母鸡,{chicken}只小鸡"

当然,这只是最基本的计算机思维下的穷举法,如果我们稍微代入一点数学知识,就会发现cock、hen、chicken三者中的任一个都可以由另外两个得到,比如,所以完全用不到三层循环,只要知道cock和hen,就可以根据方程1得到chicken的数量。此外,由于chicken的上限最大(297),消灭chicken的循环将能最大减少循环次数,提高效率,于是,可以修改代码如下:

for cock in range(20):for hen in range(33):chicken = 100-cock-henif 5*cock+3*hen+chicken/3==100:print(f"可买{cock}只公鸡,{hen}只母鸡,{chicken}只小鸡"

得到的答案是一样的,说明程序实现的效果相同,但效率大为提升。

但这还没完。

通过数学思维,我们可以进一步发现,将等式2两边都乘以3,再减去等式1,就可以把变量chicken消去,

得到一个新的等式:

两边再同时除以2,得到:

于是就可以从公鸡的数量得到母鸡的数量:,进而把第二层循环也可以省去了。

同时,观察这个母鸡的等式,右边是公鸡的数量除以4,而常识告诉我们,母鸡的数量必须

  1. 是整数
  2. 大于0

于是,cock的数量必须是4的整数倍,而且。而cock的数量本身也必须是整数,所以cock的取值范围就是 

因此,我们可以编写代码,仅仅对这个范围的cock数量进行穷举,数量大大减少,0、4、8、12,计算效率大大提高。唯一需要注意的是,因为引入了除法(7/4),得到的结果自动变成浮点型数据,即使能整除,得到的结果显示出来也是x.0的样子。而我们要输出整数,所以这里可以使用int()把计算结果转成整数型,或者,直接使用整除运算符(//)。

for cock in range(0,14,4):hen = 25-int(cock*7/4):chicken = 100-cock-henif 5*cock+3*hen+chicken/3==100:print(f"可买{cock}只公鸡,{hen}只母鸡,{chicken}只小鸡"

输出

可买0只公鸡,25只母鸡,75只小鸡
可买4只公鸡,18只母鸡,78只小鸡
可买8只公鸡,11只母鸡,81只小鸡
可买12只公鸡,4只母鸡,84只小鸡

其实,当我们使用数学知识手动完成上面的计算后,得到的解(公鸡数量0、4、8、12)必然就是合理解了,无需再进行验证,由此可见,在这里使用代码反而显得画蛇添足、多此一举了。这便是计算机思维和数学思维的区别。计算机思维看似简单,但胜在运算速度,而数学思维总是可以更巧妙地找到更快解决问题的办法,有时甚至都不需要用到计算机思维。而我们要做的,就是在面对不同问题的时候,将二者结合起来,取长补短,争取以最高的效率解决问题。

Python趣味算法入门 - 百钱百鸡相关推荐

  1. Python趣味算法入门 - 打鱼还是晒网

    问题描述 中国有句俗语叫"三天打鱼两天晒网".某人从1990年1月1日起便开始"三天打鱼两天晒网",问这个人在以后的某一天中是"打鱼"还是& ...

  2. Python趣味算法入门 - 牛顿迭代法求方程根

    问题描述 编写用牛顿迭代法求方程根的函数.方程为,系数a,b,c,d由主函数输入,求x在1附近的一个实根.求出根后,由主函数输出. 牛顿迭代法的公式:,设迭代到  时结束. 分析 在网上可以找到很多关 ...

  3. Python基础-“百钱百鸡”入门逻辑题(刚开始的建议藏起来)

    一:前言 最近这段时间辣条哥发现学Python的人是越来越多,但是适不适合学Python又有几个人知道呢?说到底编程其实很多时候需要的是较强的思维逻辑能力,如果基础的思维逻辑能力不行的话那辣条就得好好 ...

  4. python算法1.5百钱百鸡

    1.问题描述 中国古代数学家张丘建在他的<算经>中提出了一个著名的"百钱百鸡问题":一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡.母鸡. ...

  5. 100个python算法超详细讲解:百钱百鸡

    1.问题描述 中国古代数学家张丘建在他的<算经>中提出了一个著名的"百钱 百鸡问题":一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现 在要用百钱买百鸡,请问公鸡.母 ...

  6. java while求百钱买百鸡问题_java - 百钱百鸡小算法

    百钱百鸡是一个非常经典的不定方程问题,最早源于我国古代的<算经>,这是古代著名数学家张丘建首次提出的.百钱百鸡问题原文如下: 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买白鸡,问 ...

  7. C/C++基础讲解(二十九)之数值计算与趣味数学篇(百钱百鸡问题、爱因斯坦的数学题、三色球问题与马克思手稿中的数学题)

    C/C++基础讲解(二十九)之数值计算与趣味数学篇(百钱百鸡问题.爱因斯坦的数学题.三色球问题与马克思手稿中的数学题) 程序之美 前言 很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本 ...

  8. 《用Python解决寻找水仙花数,百钱百鸡问题|CSDN创作打卡》

    使用Python编程解决算法问题 目录 使用Python编程解决算法问题 一.用Python解决寻找水仙花数问题 二.用Python解决百钱百鸡问题 算法问题1:用Python解决寻找水仙花数问题. ...

  9. 计算机求百钱买百鸡采用的算法,多种解法求百钱百鸡问题.doc

    多种解法求百钱百鸡问题 学 号: 0121210680225 <算法设计与分析B> 大 作 业 题 目多种解法求百钱百鸡问题学 院计算机科学与技术学院专 业软件工程班 级Sy1201姓 名 ...

最新文章

  1. 全景图拼接算法实现与改进
  2. 迷你世界电锯机器人_迷你世界:会旋转的机器人,安装多个火箭炮,全方位轰炸敌人...
  3. Linux sar性能分析
  4. LINUX CP 命令强制覆盖功能开启/关闭
  5. 技术有温,代码有爱——1024技术公益信息无障碍
  6. ubuntu14.04 源
  7. 第 3-3 课:泛型和迭代器 + 面试题
  8. 贝叶斯方法(Bayesian approach) —— 一种概率解释(probabilistic interpretation)
  9. python获取键盘输入_Python 3 学习笔记之——键盘输入和读写文件
  10. leetcode isPalindrome (回文数判断)
  11. 阿里技术参考图册-研发篇
  12. skynet源码阅读7--死循环检测
  13. 6个实用的 Python 自动化脚本,告别加班,你学会了吗?
  14. 灰色预测 Matlab
  15. 图像处理技术-基本运算
  16. OH----调试T7520过程中对 linux usb dwc3的总结
  17. mppdb 查看建表语句_内存MPP数据库介绍.pptx
  18. 区块链中的记账权问题
  19. python解压zip_用Python处理ZIP压缩包
  20. 【数学建模】基于matlab模拟疫情SEIRS模型【含Matlab源码 2214期】

热门文章

  1. java 强制类型转换
  2. 天微TM1650数码管驱动IC新旧版 驱动和注意事项
  3. ubuntu下命令行禁用笔记本触摸板
  4. 攻防世界MISC刷题1-50
  5. 带感小说:程序员坐牢会被安排写代码吗?
  6. word中插入页码方法
  7. Python---文件写入
  8. 一篇 CVPR 2022顶会论文是如何炼成的,顶会一作亲述
  9. CSS相对地址与绝对地址
  10. 发票核验API 分享推荐