通过上两节课的学习,大家对Python中的分支和循环结构已经有了感性的认识。分支和循环结构的重要性不言而喻,它是构造程序逻辑的基础,对于初学者来说也是相对困难的部分。大部分初学者在学习了分支和循环结构后都能理解它们的用途和用法,但是遇到实际问题的时候又无法下手;看懂别人的代码很容易,但是要自己写出同样的代码却又很难。如果你也有同样的问题和困惑,千万不要沮丧,这只是因为你才刚刚开始编程之旅,你的练习量还没有达到让你可以随心所欲的写出代码的程度,只要加强编程练习,这个问题迟早都会解决的。下面我们就为大家讲解一些经典的案例。
经典小案例
例子1:寻找水仙花数。
说明:水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:
。
这个题目的关键是将一个三位数拆分为个位、十位、百位,这一点利用Python中的//(整除)和%(求模)运算符其实很容易做到,代码如下所示。
"""找出所有水仙花数"""for num in range(100, 1000):low = num % 10mid = num // 10 % 10high = num // 100if num == low ** 3 + mid ** 3 + high ** 3:print(num)
上面利用//和%拆分一个数的小技巧在写代码的时候还是很常用的。我们要将一个不知道有多少位的正整数进行反转,例如将12345变成54321,也可以利用这两个运算来实现,代码如下所示。
"""正整数的反转"""num = int(input('num = '))reversed_num = 0while num > 0:reversed_num = reversed_num * 10 + num % 10num //= 10print(reversed_num)
例子2:百钱百鸡问题。
说明:百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
"""《百钱百鸡》问题"""# 假设公鸡的数量为x,x的取值范围是0到20for x in range(0, 21):# 假设母鸡的数量为y,y的取值范围是0到33for y in range(0, 34):z = 100 - x - yif 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:print(f'{x}只公鸡,{y}只母鸡,{z}只小鸡')"""0只公鸡,25只母鸡,75只小鸡4只公鸡,18只母鸡,78只小鸡8只公鸡,11只母鸡,81只小鸡12只公鸡,4只母鸡,84只小鸡"""
上面使用的方法叫做穷举法,也称为暴力搜索法,这种方法通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,只要问题的解存在就能够找到它。
例子3:CRAPS游戏。
说明:CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简化后的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;玩家如果摇出其他点数则玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数玩家继续摇骰子,直到分出胜负。
"""Craps赌博游戏我们设定玩家开始游戏时有1000元的赌注游戏结束的条件是玩家输光所有的赌注"""from random import randintmoney = 1000while money > 0:print(f'你还有{money}')need_go_on = Falsewhile True:debt = int(input('请下注: '))if 0 < debt <= money:breakfirst = randint(1, 6) + randint(1, 6)print('玩家摇出了%d点' % first)if first == 7 or first == 11:print('玩家胜!')money += debtelif first == 2 or first == 3 or first == 12:print('庄家胜!')money -= debtelse:need_go_on = Truewhile need_go_on:need_go_on = Falsecurrent = randint(1, 6) + randint(1, 6)print('玩家摇出了%d点' % current)if current == 7:print('庄家胜!')money -= debtelif current == first:print('玩家胜!')money += debtelse:need_go_on = Trueprint('你破产了, 游戏结束!')
例子4:斐波那契数列。
说明:斐波那契数列(Fibonacci sequence),通常也被称作黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中研究在理想假设条件下兔子成长率问题而引入的数列,因此这个数列也常被戏称为“兔子数列”。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,按照这个规律,斐波那契数列的前10个数是:>
1, 1, 2, 3, 5, 8, 13, 21, 34, 55。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。 ```python-- coding: utf-8 --
@Author : CFXin
@Time : 2021/07/09 16:25
前两个数都是1
a, b = 1, 1 print(a, b, end=’ ‘)
通过递推公式算出后面的18个数
for _ in range(18): a, b = b, a + b print(b, end=’ ‘)
<a name="Fowt8"></a>### 例子5:打印素数。> **说明**:素数指的是只能被1和自身整除的正整数(不包括1)。```python# -*- coding: utf-8 -*-# @Author : CFXin# @Time : 2021/07/09 16:25"""输出100以内的素数"""from math import sqrtfor num in range(2, 101):is_prime = Trueend = int(sqrt(num))for i in range(2, end+1):if num % i == 0:is_prime = Falsebreakif is_prime:print(num)
例6:找出10000以内的完美数。
说明:完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美数。完美数有很多神奇的特性,有兴趣的可以自行了解。
# -*- coding: utf-8 -*-# @Author : CFXin# @Time : 2021/07/09 16:25"""例6:找出10000以内的完美数"""for num in range(1, 10001):factor_list = [] # 存储因子for factor in range(1, num): # 不包含自身if num % factor == 0:factor_list.append(factor)if sum(factor_list) == num:# print(factor_list)print(num)
