# 分支和循环结构实战 分支结构和循环结构是构造程序逻辑的基础。本节通过五个经典例子,帮助你巩固和深化对这两种结构的理解。 ## 例子1:100以内的素数 ```python for num in range(2, 100): is_prime = True for i in range(2, int(num ** 0.5) + 1): if num % i == 0: is_prime = False break if is_prime: print(num, end=' ') ``` ## 例子2:斐波那契数列 ```python # 输出前20个斐波那契数 a, b = 0, 1 for _ in range(20): a, b = b, a + b print(a) ``` > **斐波那契数列**:1, 1, 2, 3, 5, 8, 13, 21, 34, 55... 从第三项起每项是前两项之和。 ## 例子3:水仙花数 水仙花数:一个 N 位正整数,其各位数字的 N 次方之和等于该数本身。 ```python # 100到999的三位数水仙花数:153, 370, 371, 407 for num in range(100, 1000): low = num % 10 # 个位 mid = num // 10 % 10 # 十位 high = num // 100 # 百位 if num == low**3 + mid**3 + high**3: print(num) ``` ### 正整数反转(`//` 和 `%` 的应用) ```python num = int(input('num = ')) reversed_num = 0 while num > 0: reversed_num = reversed_num * 10 + num % 10 num //= 10 print(reversed_num) # 输入: 12389 → 输出: 98321 ``` ## 例子4:百钱百鸡问题 > 公鸡5元/只,母鸡3元/只,小鸡1元3只。用100元买100只鸡,问各几只? ```python for x in range(0, 21): # 公鸡最多20只(5*20=100) for y in range(0, 34): # 母鸡最多33只(3*33=99) z = 100 - x - y # 小鸡数量由总数决定 if z % 3 == 0 and 5*x + 3*y + z//3 == 100: print(f'公鸡{x}只, 母鸡{y}只, 小鸡{z}只') ``` > **算法**:穷举法——遍历所有可能的组合,满足两个条件即输出解。 ## 例子5:CRAPS赌博游戏 简化规则: - 第一次掷出 7 或 11 → 玩家胜 - 第一次掷出 2、3、12 → 庄家胜 - 其他点数:继续掷,直到掷出 7(庄家胜)或第一次的点数(玩家胜) ```python import random money = 1000 while money > 0: print(f'总资产: {money}元') while True: debt = int(input('请下注: ')) if 0 < debt <= money: break first_point = random.randrange(1, 7) + random.randrange(1, 7) print(f'摇出{first_point}点') if first_point in (7, 11): print('玩家胜!') money += debt elif first_point in (2, 3, 12): print('庄家胜!') money -= debt else: while True: current = random.randrange(1, 7) + random.randrange(1, 7) print(f'摇出{current}点') if current == 7: print('庄家胜!') money -= debt break elif current == first_point: print('玩家胜!') money += debt break print('破产了,游戏结束!') ``` ## 总结 - 熟练使用 `//` 和 `%` 拆分数字位 - 斐波那契数列用双变量交换实现递推 - 穷举法适合组合爆炸问题,但要注意优化减少循环次数 - 分支+循环组合可以构建完整的游戏逻辑