Python趣味算法入门 - 百钱百鸡

news2024/11/29 2:53:05

问题描述

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

分析

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

\left\{\begin{matrix} cock + hen + chicken = 100\\ 5*cock+3*hen+\frac{chicken}{3}=100 \end{matrix}\right.

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

因为100钱最多可以买100\div 5=20只公鸡,100\div 3=33只母鸡,100\ast 3=300只小鸡,所以这三个变量的上限分别是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三者中的任一个都可以由另外两个得到,比如chicken = 100-cock-hen,所以完全用不到三层循环,只要知道cock和hen,就可以根据方程1得到chicken的数量。此外,由于chicken的上限最大(297),消灭chicken的循环将能最大减少循环次数,提高效率,于是,可以修改代码如下:

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

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

但这还没完。

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

\left\{\begin{matrix} cock + hen + chicken = 100\\ 15*cock+9*hen+chicken=300 \end{matrix}\right.

得到一个新的等式:14*cock+8*hen=200

两边再同时除以2,得到:7*cock+4*hen=100

于是就可以从公鸡的数量得到母鸡的数量:hen=25-\frac{7}{4}*cock,进而把第二层循环也可以省去了。

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

  1. 是整数
  2. 大于0

于是,cock的数量必须是4的整数倍,而且\frac{7}{4}*cock\leqslant 25。而cock的数量本身也必须是整数,所以cock的取值范围就是 0\leqslant cock\leqslant 14

因此,我们可以编写代码,仅仅对这个范围的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-hen
    if 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)必然就是合理解了,无需再进行验证,由此可见,在这里使用代码反而显得画蛇添足、多此一举了。这便是计算机思维和数学思维的区别。计算机思维看似简单,但胜在运算速度,而数学思维总是可以更巧妙地找到更快解决问题的办法,有时甚至都不需要用到计算机思维。而我们要做的,就是在面对不同问题的时候,将二者结合起来,取长补短,争取以最高的效率解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

所见即所得即MySQL函数

✨✨hello,愿意点进来的小伙伴们,你们好呐! 🐻🐻系列专栏:【MySQL初阶】 🐲🐲本篇内容:MySQL函数的详解 🐯🐯作者简介:一名现大二的三非编程小白&…

【Spring】核心部分之IOC:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心IOC,IOC有这一篇足以

IOC一,概念和原理1.概念:控制反转2.原理:(xml解析,工厂模式,反射)3.IOC接口:两个主要容器实现类(加载xml配置文件)二,操作Bean管理1.基于 xml 配置…

React - 实现瀑布流加载

React - 实现瀑布流加载一. 瀑布流实现1.1 处理重复请求问题一. 瀑布流实现 先来看下原本的效果,一次性加载完所有的信息然后展示: 其次,我们需要去监听这个滚轮的滚动事件,那么React页面就可以添加一个监听器: use…

SpringSecurity Oauth2实战 - 04 自定义AuthProvider实现登录认证

文章目录1. 搭建资源服务器1. Token存储配置类 TokenStoreAutoConfiguration2. 资源服务器配置类 ResourceServerAutoConfiguration3. 在META-INF/spring.factories文件下添加配置类2. 搭建授权服务器1. 密码加密配置类 PasswordEncodeConfig2. RestTemplateConfig3. 授权服务器…

k3s 离线部署指南

文章目录1. 简介2. Docker 手动部署镜像方式2.1 安装docker2.2 导入镜像2.3 安装 k3s2.4 查看3. Containerd 手动部署镜像方式3.1 导入镜像到 containerd 镜像列表3.2 授予可执行权限3.3 安装 K3s4. Containerd 私有镜像仓库方式4.1 配置 K3s 镜像仓库4.2 授予可执行权限4.3…

集合(Set)和有序集合(ZSet)的基本使用方法详解【Redis】

文章目录一. Redis中的集合(Set)1.1基本的一些操作1.1.1 smembers查看集合中的所有成员1.1.2 scard删除成员数量1.1.3 smove移动成员1.1.4 sinterstore 存储俩个集合的交集二.Redis中的有序集合(ZSet)2.1 基本的一些操作2.1.1 zadd添加1到多个成员2.1.2 zcount 返回指定分数区间…

【HarmonyOS】鸿蒙轻量级智能穿戴应用可以集成华为分析SDK吗?

1、问题描述 我们的项目是基于鸿蒙系统开发的轻量级智能穿戴应用,目前在做的主要是运动手表GT3。 我们在项目中使用了华为分析服务,但是在Build Hap时出现问题: 因此,我们想了解轻量级智能穿戴应用项目中是否能够集成华为分析服…

计算机毕业设计(附源码)python在线影评系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Leetcode-每日一题1106. 解析布尔表达式(DFS模拟栈)

题目链接:点击跳转 思路 方法一、DFS模拟栈 题目意思很简单让你去判断与或非布尔表达式的结果,我们可以看布尔表达式看成一棵树,需要我们解决的是从最底层的嵌套布尔表达式产生的结果不断向上的结果,如图: 既然他是…

云栖大会开源重磅升级!PolarDB-X v2.2: 企业级和国产化适配

2022 年云栖大会上,PolarDB-X 发布 2.2.0 版本,这是一个重要的里程碑版本,重点推出符合分布式数据库金融标准下的企业级和国产化适配,共包括八大核心特性,全面提升 PolarDB-X 分布式数据库在金融、通讯、政务等行业的普…

自定义分页器

文章目录自定义分页器1、分页推导2、分页器代码封装自定义分页器 1、分页推导 queryset对象支持切片操作 确定用户访问的页码 url?page1 current_pagerequest.GET.get(page,1)前端获取到 的都是字符串数据,需要类型转换 current_page request.GET.get(page,…

为什么C语言执行效率高,运行快?

目录 简述C语言由来 BCPL语言及代码B语言以及代码C语言 编程语言 机器语言汇编语言高级语言 C为何快速 简述 都说C语言编写的程序执行效率比较高,那么到底高在哪里,我们一块来学习学习。 C语言由来 C语言源自于BCPL、B两种语言。 BCPL语言以及代码…

django csrfMiddleware的一些理解跨站和跨域

术语 术语解释备注跨域两个 URL 的“协议主机名端口”3者只要有一个不一致http://www.taobao.com/和https://www.taobao.com/跨站两个 URL 的 eTLD1 不相同a.github.io 和 b.github.ioeTLDeffective top level domain (有效顶级域名).com、.co.uk、.git…

第六节:数组的定义与使用【java】

目录 📃1. 数组的基本概念 1.1 为什么要使用数组 1.2 什么是数组 1.3 数组的创建及初始化 1.4 数组的使用 🎒2. 数组是引用类型 2.1 初始JVM的内存分布 2.2 基本类型变量与引用类型变量的区别 2.3 认识 null 2.4 再谈引用变量 📖3. …

Redis的RDB持久化配置以及数据恢复

文章目录Redis的RDB持久化配置以及数据恢复配置RDB持久化机制RDB持久化机制的工作流程基于RDB持久化机制的数据恢复Redis的RDB持久化配置以及数据恢复 配置RDB持久化机制 在 redis 的配置文件中找到如下内容: 以 save 60 10000 为例,表示每隔 60s&…

Springboot 整合与文件配置

哈喽~大家好,这篇看看Springboot 整合与文件配置。 🥇个人主页:个人主页 🥈 系列专栏:【Java框架】 🥉与这篇相关的文章: 【JAVAEE框架】MyBatis与Spring的整合&#xff0…

Unity-huatuo热更新调研

文章目录1. 相关资料2. 环境准备2.1 项目和编辑器版本2.2 安装huatuo插件2.3 在build settings里面勾选Export Project2.4 导出Android studio工程3. 验证热更新3.1 更改读取目录3.2 运行android apk3.3 热更新1. 相关资料 bilibili视频:https://www.bilibili.com/…

学院打卡第十四天

今天是一道困难题,难得有困难题!! 如题: 但是这个困难题感觉也不是很”困难“!!! 算法思想: 第一感觉就是利用栈的思想,这种题做多了,一看见就是想到栈&…

2021年上半年软件设计师下午真题及答案解析(三)

阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某中医医院拟开发一套线上抓药APP,允许患者凭借该医院医生开具的处方线上抓药,并提供免费送药上门服务。该系统的主要功能描述如下: &#…

Kotlin编程实战——概述(01)

一 概述 Kotlin用于服务器开发Kotlin 进行 Android 开发Kotlin 用于 JavaScript 开发Kotlin 用于原生开发Kotlin 用于数据科学协程多平台 二 Kotlin用于服务器开发 2.1 原因 表现力可伸缩性互操作性迁移迁移工具学习曲线 2.2 Kotlin 进行服务器端开发的框架 Spring、Vert.…