python算法:分糖果
一,while循环:
1,功能:重复执行同一段代码
语法:
while 条件表达式:
    # 循环体
 当条件表达式的返回值为真时,则执行循环体中的语句,
执行完毕后,重新判断条件表达式的返回值,
如果表达式返回的结果为假,则退出循环体
2,流程图:

3,打印从1到10
| 
 1 
2 
3 
4 
5 
 | 
# 打印从1到10n = 1while 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 
                    
                
                
            
        
浙公网安备 33010602011771号