分支和循环结构实战
# 分支和循环结构实战
分支结构和循环结构是构造程序逻辑的基础。本节通过五个经典例子,帮助你巩固和深化对这两种结构的理解。
## 例子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('破产了,游戏结束!')
```
## 总结
- 熟练使用 `//` 和 `%` 拆分数字位
- 斐波那契数列用双变量交换实现递推
- 穷举法适合组合爆炸问题,但要注意优化减少循环次数
- 分支+循环组合可以构建完整的游戏逻辑