python演算法:分糖果

刘宏缔的架构森林發表於2024-05-16

一,while迴圈:

1,功能:重複執行同一段程式碼
語法:

while 條件表示式:
    # 迴圈體

 當條件表示式的返回值為真時,則執行迴圈體中的語句,
執行完畢後,重新判斷條件表示式的返回值,
如果表示式返回的結果為假,則退出迴圈體

2,流程圖:

python演算法:分糖果

3,列印從1到10

1
2
3
4
5
# 列印從1到10
n = 1
while n <= 10:
print(n, end=" ")
n += 1

執行結果:

1 2 3 4 5 6 7 8 9 10 

說明:劉宏締的架構森林—專注it技術的部落格,
網址:https://imgtouch.com
本文: https://blog.imgtouch.com/index.php/2024/03/22/python-suan-fa-fen-tang-guo/
程式碼: https://github.com/liuhongdi/https://gitee.com/liuhongdi
說明:作者:劉宏締 郵箱: 371125307@qq.com

二,分糖果的題目與解析

1,題目:

10個小孩圍成一圈分糖果,老師分給第1個小孩10塊,
第2個小孩2塊,
第3個小孩8塊,
第4個小孩22塊,
第5個小孩16塊,
第6個小孩4塊,
第7個小孩10塊,
第8個小孩6塊,
第9個小孩14塊,
第10個小孩20塊。
然後所有糖塊數為偶數的小孩將手中的糖分一半給右邊的小孩;所有糖塊數為奇數的人可向老師要一塊再分一半給右邊小孩。
問:經過這樣幾次後大家手中的糖一樣多?每人各有多少塊糖?

2,解析:

思路:
10個小孩開始時所擁有的糖果數是不同的,但分糖的動作卻是相同的,
即“所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數為奇數的人可向老師要一塊”。
所以是一個典型的可使用迴圈結構來解決的問題。

將老師開始給每個小孩分配的糖果數作為迴圈的初始條件,
以“所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數為奇數的人可向老師要一塊”這個重複的動作作為迴圈體,
迴圈的結束條件為所有小孩手中的糖塊數一樣多。

三,編寫程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 函式:判斷列表中各成員是否相等
# candy:儲存糖果數量的列表
def judge(candy):
for i in range(0, 10):
if candy[0] != candy[i]:
return 1 # 不相同返回1
return 0 # 相同返回0
# 輸出列表中每個元素的值
# s: 要列印的列表
# j: 需要列印的次數計數器
def print_result(s, j):
print("%4d" % j, end=" ")
for k in range(10): # 列印列表
print("%4d" % s[k], end=" ")
print() # 換行
# 分糖的函式
# sweet: 儲存糖果數量的列表
# j: 計數器,記錄分糖的次數
def giveSweets(sweet, j):
t = [0] * 10 # 臨時表,儲存每次分出去的一半糖
while (judge(sweet)): # 若不滿足要求則繼續迴圈
# 將每個孩子手中的糖果數平分為兩份,放到t列表中
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]
# 將分出的一半糖果t[n] 給右邊的孩子 sweet[n + 1]
for n in range(0, 9):
sweet[n + 1] = sweet[n + 1] + t[n]
sweet[0] += t[9] # 第10個分出去的一個t[9],給第一個孩子:sweet[0]
j += 1 # 計數器加1
print_result(sweet, j) # 列印本次分糖後的結果
# 定義列表sweet,儲存老師給每個孩子分配的糖果數
# sweet[0]=10表示第一個小孩的糖果數為10,以此類推
sweet = [10, 2, 8, 22, 16, 4, 10, 6, 14, 20]
print("次數 各人糖果數")
j = 0 # 計數器,儲存分糖的次數
# 輸出每個孩子手中的糖果數
print("%4d" % j, end=" ")
for i in range(len(sweet)):
print("%4d" % sweet[i], end=" ")
print()
# 開始分糖
giveSweets(sweet, j) # 呼叫分糖果函式

執行結果:

次數 各人糖果數
   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 

相關文章