Python算法100例-2.6 分糖果

完整源代码项目地址,关注博主私信'源代码'后可获取

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.确定程序框架
  • 5.完整的程序
  • 6.运行结果

1.问题描述

10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖一样多?每人各有多少块糖?

2.问题分析

根据题意,10个小孩开始时所拥有的糖果数是不同的,但分糖的动作却是相同的,即“所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块”。因此,这是一个典型的可使用循环结构来解决的问题。

将老师开始给每个小孩分配的糖果数作为循环的初始条件,以“所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块”这个重复的动作作为循环体,循环的结束条件为所有小孩手中的糖块数一样多。在循环体中,还需要判断糖块数的奇偶性,奇偶性不同完成的操作也不相同,显然这需要使用一个选择结构来实现。

3.算法设计

在问题分析中,我们已经确定了该问题使用循环结构来解决。那么如何存放每个小孩初始时所拥有的糖果数呢?这里考虑使用数组来存放老师开始给每个小孩分配的糖果数,因为有10个小孩,故定义一个长度为10的整型数组即可。在循环过程中,糖果每经过一次重新分配,就打印输出一次,直到最后一次打印时,10个小孩所拥有的糖果数都相同,此时结束循环。

4.确定程序框架

(1)定义整型数组存放初始条件

# sweet[0]=10表示第一个小孩的糖果数为10,以此类推
sweet = [10, 2, 8, 22, 16, 4, 10, 6, 14, 20]

将老师开始给每个小孩分配的糖果数存放到sweet数组中。

(2)循环结构实现框架

while (10个孩子手中的糖果数不相同):                         # 若不满足要求则继续循环
# 将每个孩子手中的糖果数平分为两份for i in range(0, 10):if sweet[i] % 2 == 0:                               # 若为偶数则直接分出一半sweet[i] = sweet[i] // 2t[i] = sweet[i]else:                                                               # 若为奇数则加1后再分出一半sweet[i] = (sweet[i] + 1) // 2t[i] = sweet[i]# 将分出的一半糖果给右边的孩子for n in range(0, 9):sweet[n + 1] = sweet[n + 1] + t[n]sweet[0] += t[9]j += 1printResult(sweet, j)                                   # 输出当前每个孩子手中的糖果数

上面的代码在while循环结构中又包含了两个for循环。

while循环的循环条件为“10个孩子手中的糖果数不相同”,第一个for循环用来将当前每个孩子手中的糖果分成一半,同时将分配结果保存在数组t中。在分配时注意区分奇偶数糖果分配方式的不同。第二个for循环用来将每个孩子手中已分好的一半的糖果给右边的孩子,由于第一个for循环中已经将每个孩子手中一半的糖果数保存在t数组中了,因此可直接利用t数组中的值修改sweet数组中的对应元素值。又由于“10个小孩围成一圈分糖果”,因此,sweet[9]右边的元素为sweet[0]。

(3)定义judge()函数

judge()函数用来判断每个孩子手中的糖果数是否相同。judge()函数的参数为整型数组,它可以判断该数组中各个元素的值是否相同,如果数组中所有元素的值都相同,则judge()函数返回值为0,否则judge()函数返回值为1。

judge()函数代码如下:

# 判断每个孩子手中的糖果数是否相同
def judge(candy):for i in range(0,10):if candy[0] != candy[i]:return 1                                # 不相同返回1return 0                                        # 相同返回0

程序流程图如图所示。

在这里插入图片描述

5.完整的程序

根据上面的分析,编写程序如下:

%%time
# 分糖果# 判断每个孩子手中的糖果数是否相同
def judge(candy):for i in range(0,10):if candy[0] != candy[i]:return 1     # 不相同返回1return 0   #相同返回0def giveSweets(sweet, j):t = [0] * 10while (judge(sweet)):  # 若不满足要求则继续循环# 将每个孩子手中的糖果数分成一半for i in range(0, 10):if sweet[i] % 2 == 0:  # 若为偶数则直接分出一半sweet[i] = sweet[i] // 2t[i] = sweet[i]else:  # 若为奇数则加1后再分出一半sweet[i] = (sweet[i] + 1) // 2t[i] = sweet[i]# 将分出的一半糖果给右边的孩子for n in range(0, 9):sweet[n + 1] = sweet[n + 1] + t[n]sweet[0] += t[9]j += 1printResult(sweet, j)# 输出列表中每个元素的值
def printResult(s, j):print("%4d" %j , end=" ")k = 0while k < 10:print("%4d" % s[k], end=" ")k += 1j += 1print()if __name__=="__main__":# 定义一个列表来存储老师给每个孩子分配的糖果数# sweet[0]=10表示第一个小孩的糖果数为10,以此类推sweet = [10, 2, 8, 22, 16, 4, 10, 6, 14, 20]print("child  1    2    3    4    5    6    7    8    9   10")print("..........................................................")print("次数   糖果数")# 输出每个孩子手中的糖果数j = 0print("%4d" % j, end=" ")for i in range(len(sweet)):print("%4d" % sweet[i], end=" ")print()giveSweets(sweet,j)  # 分糖果
child  1    2    3    4    5    6    7    8    9   10
..........................................................
次数   糖果数0   10    2    8   22   16    4   10    6   14   20 1   15    6    5   15   19   10    7    8   10   17 2   17   11    6   11   18   15    9    8    9   14 3   16   15    9    9   15   17   13    9    9   12 4   14   16   13   10   13   17   16   12   10   11 5   13   15   15   12   12   16   17   14   11   11 6   13   15   16   14   12   14   17   16   13   12 7   13   15   16   15   13   13   16   17   15   13 8   14   15   16   16   15   14   15   17   17   15 9   15   15   16   16   16   15   15   17   18   17 10   17   16   16   16   16   16   16   17   18   18 11   18   17   16   16   16   16   16   17   18   18 12   18   18   17   16   16   16   16   17   18   18 13   18   18   18   17   16   16   16   17   18   18 14   18   18   18   18   17   16   16   17   18   18 15   18   18   18   18   18   17   16   17   18   18 16   18   18   18   18   18   18   17   17   18   18 17   18   18   18   18   18   18   18   18   18   18 
CPU times: user 2.09 ms, sys: 1.6 ms, total: 3.69 ms
Wall time: 3.04 ms

6.运行结果

从输出结果可知,经过17次分糖过程后,10个孩子手中的糖果数相等,都为18块。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 中实现音视频播放进度条(满足常见开发需求)

由于开发需要&#xff0c;作者封装了一个音视频播放进度条的插件&#xff0c;支持 vue2 及 vue3 &#xff0c;有需要的朋友后台私信作者获取插件哦&#xff0c;下面是对该款插件的介绍。 插件默认样式&#x1f447;&#xff08;插件提供了多个配置选项&#xff0c;可根据自身需…

深度访谈 | 模块化建筑让设计和建造更简单!

从汽车行业转行建筑行业转行建筑行业&#xff0c;将汽车工业理念和建筑营造结合。大咖面对面&#xff0c;优积科技CEO刘其东接受自媒体视频号——Elaine深度专访。解读像造汽车一样造房子。 汽车行业和建筑行业有何渊源&#xff1f;到底是什么样的机缘巧合使一帮造汽车的团队要…

PDF文件转换为图片

现在确实有很多线上的工具可以把pdf文件转为图片&#xff0c;比如smallpdf等等&#xff0c;都很好用。但我们有时会碰到一些敏感数据&#xff0c;或者要批量去转&#xff0c;那么需要自己写脚本来实现&#xff0c;以下脚本可以提供这个功能~ def pdf2img(pdf_dir, result_path…

低代码与大语言模型的探索实践

低代码系列文章&#xff1a; 可视化拖拽组件库一些技术要点原理分析可视化拖拽组件库一些技术要点原理分析&#xff08;二&#xff09;可视化拖拽组件库一些技术要点原理分析&#xff08;三&#xff09;可视化拖拽组件库一些技术要点原理分析&#xff08;四&#xff09;低代码…

MQTT协议解析:揭秘固定报头、可变报头与有效载荷的奥秘

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种轻量级的通讯协议&#xff0c;常用于远程传感器和控制设备的通讯。MQTT协议基于发布/订阅模式&#xff0c;为大量计算能力有限且工作在低带宽、不可靠网络环境中的设备…

Java设计模式 | 简介

设计模式的重要性&#xff1a; 软件工程中&#xff0c;设计模式&#xff08;design pattern&#xff09;是对软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;所提出的解决方案。 这个术语由埃里希 伽玛&#xff08;Erich Gamma&#xff09;等人在1…

【JavaEE】_前端POST请求使用json向后端传参

目录 1. 关于json 2. 通过Maven仓库&#xff0c;将Jackson下载导入到项目中 3. 使用Jackson 3.1 关于readValue方法 3.2 关于Request.class类对象 3.3 关于request对象的属性类型 3.4 关于writeValueAsString 前端向后端传递参数通常有三种方法&#xff1a; 第一种&…

Android和Linux的开发差异

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

Redis之一: 简介及环境安装搭建

什么是NoSQL? NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。&#xff08;例如谷歌或Facebook每天为他们的用户收集万亿比特的数据&#xf…

C++:类与对象(2)

创作不易&#xff0c;感谢三连&#xff01; 一、六大默认成员函数 C为了弥补C语言的不足&#xff0c;设置了6个默认成员函数 二、构造函数 2.1 概念 在我们学习数据结构的时候&#xff0c;我们总是要在使用一个对象前进行初始化&#xff0c;这似乎已经成为了一件无法改变的…

算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和

哈希表基础知识 哈希表 哈希表关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff1b;数组就是哈希表的一种 一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在班级里&#xff1a; 要枚举的话时间复杂度是O(n)&…

【postgresql】数据表id自增与python sqlachemy结合实例

需求&#xff1a; postgresql实现一个建表语句&#xff0c;表名&#xff1a;student,字段id,name,age&#xff0c; 要求&#xff1a;每次添加一个数据id会自动增加1 在PostgreSQL中&#xff0c;您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数学建模资料分享

1. 往年各赛题的优秀论文 可以用来参考一下论文是怎么写的。参考论文的结构&#xff0c;格式&#xff0c;思路等等。 链接&#xff1a;https://pan.baidu.com/s/1WG2t4-x9MjtaSgkq4ue5AQ?pwdnlzx 提取码&#xff1a;nlzx --来自百度网盘超级会员V4的分享 2.论文模板 链接&a…

300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?

Redis 数据类型 首先&#xff0c;来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型&#xff0c;分别是 &#xff1a; & string 字符串类型&#xff1b; & list 列表类型&#xff1b; & set 集合类型&#xff1b; & sorted set 有序集合类型&…

[leetcode] 37. 解数独

文章目录 题目描述解题方法dfsjava代码复杂度分析 相似题目 题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3…

RV32/64 特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret&#xff08;从机器模式返回到先前的模式&#xff09;2.2 sret&#xff08;从监管模式返回到先前的模式&#xff09;2.3 wfi&#xff08;等待中断&#xff09;2.4 sfence.vma&#xff08;内存屏障&#xff09; …

Stable Diffusion 3 发布及其重大改进

1. 引言 就在 OpenAI 发布可以生成令人瞠目的视频的 Sora 和谷歌披露支持多达 150 万个Token上下文的 Gemini 1.5 的几天后&#xff0c;Stability AI 最近展示了 Stable Diffusion 3 的预览版。 闲话少说&#xff0c;我们快来看看吧&#xff01; 2. 什么是Stable Diffusion…

事件循环解析

浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有了进程后&…

SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示

目录 前言 一、加入DWZ J-UI框架 二、实现登录页面 三、实现主页面菜单显示 前言 大家好&#xff01;写文章之前先列出几篇相关文章。本文内容也在其项目中接续实现。 一. SSM项目集成Spring Security 4.X版本&#xff08;使用spring-security.xml 配置文件方式&#xff…