IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 100个python算法超详细讲解:分糖果 -> 正文阅读

[Python知识库]100个python算法超详细讲解:分糖果

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] // 2
			t[i] = sweet[i]
		else: # 若为奇数则加1后再分出一半
			sweet[i] = (sweet[i] + 1) // 2
			t[i] = sweet[i]
			# 将分出的一半糖果给右边的孩子
			for n in range(0, 9):
				sweet[n + 1] = sweet[n + 1] + t[n]
				sweet[0] += t[9]
				j += 1
				printResult(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 # 不相同返回1
return 0 #相同返回0

?程序流程图如图所示。

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 分糖果
# 判断每个孩子手中的糖果数是否相同
def judge(candy):
	for i in range(0,10):
		if candy[0] != candy[i]:
			return 1 # 不相同返回1
			return 0 #相同返回0
			def giveSweets(sweet, j):
				t = [0] * 10
				while (judge(sweet)): # 若不满足要求则继续循环
					# 将每个孩子手中的糖果数平分为两份
					for i in range(0, 10):
						if sweet[i] % 2 == 0: # 若为偶数则直接分出一半
							sweet[i] = sweet[i] // 2
							t[i] = sweet[i]
						else: # 若为奇数则加1后再分出一半
							sweet[i] = (sweet[i] + 1) // 2
							t[i] = sweet[i]
							# 将分出的一半糖果给右边的孩子
							for n in range(0, 9):
								sweet[n + 1] = sweet[n + 1] + t[n]
								sweet[0] += t[9]
								j += 1
								printResult(sweet, j)
								# 输出列表中每个元素的值
								def printResult(s, j):
									print("%4d" %j , end=" ")
									k = 0
									while k < 10:
										print("%4d" % s[k], end=" ")
										k += 1
										j += 1
										print()
										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 = 0
											print("%4d" % j, end=" ")
											for i in range(len(sweet)):
												print("%4d" % sweet[i], end=" ")
												print()
												giveSweets(sweet,j) # 分糖果

6.运行结果
在PyCharm下运行程序,结果如图所示。从输出结果可知,经过17次分糖过
程后,10个孩子手中的糖果数相等,都为18块

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 18:55:28  更:2022-05-21 18:55:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 11:42:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码