侧边栏壁纸
博主头像
phphi

phphi's blog

  • 累计撰写 51 篇文章
  • 累计收到 0 条评论

Day07 - 分支和循环结构实战

2026-4-24 / 0 评论 / 1 阅读

分支和循环结构实战

分支结构和循环结构是构造程序逻辑的基础。本节通过五个经典例子,帮助你巩固和深化对这两种结构的理解。

例子1:100以内的素数

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:斐波那契数列

# 输出前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 次方之和等于该数本身。

# 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)

正整数反转(//% 的应用)

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只鸡,问各几只?

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(庄家胜)或第一次的点数(玩家胜)
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('破产了,游戏结束!')

总结

  • 熟练使用 //% 拆分数字位
  • 斐波那契数列用双变量交换实现递推
  • 穷举法适合组合爆炸问题,但要注意优化减少循环次数
  • 分支+循环组合可以构建完整的游戏逻辑