初识枚举法
枚举法
【枚举法】 将所有情况列举出来,按照筛选条件逐一进行筛选,最后得到答案的方法。
【步骤】
确定枚举的范围
根据条件进行筛选
【例】
使用枚举法找到1-100之间3的倍数。
确定枚举的范围
枚举范围: 1 -100的数字
根据条件进行筛选
筛选条件: 3的倍数
for i in range(1, 101):
if i % 3 == 0:
print(i)
range()参数
要想遍历一串连续的数字,可以使用 for 变量 in range():
的方式,在range()的括号中设置遍历的起始值和结束值。
【注意】 结束值是取不到的哦!
- 只填写1个参数: range(结束值) 默认从0开始,到结束值之前结束
- 填写2个参数: range(起始值,结束值) 从起始值开始,到结束值之前结束
- 填写3个参数: range(起始值,结束值,步长) 从起始值开始,到 结束值之前 结束,每次间隔的值是步长
例如: for i in range(5)
: i的取值是0,1,2,3,4
例如: for i in range(1,5)
: i的取值是 1,2,3,4
例如: for i in range(1,10,2)
: i的取值是 1,3,5,7,9
求余和整除
求余:计算一个数除以另一个数的余数,使用 %
整除:计算一个数除以另一个数的商,使用 //
【应用】
- 判断倍数关系:余数为0
- 求个位数字:除以10的余数
- 求2位数字中的十位数字:除以10的商
例如:如果一个数字除以3的余数是0,那么它是3的倍数
例如:35 % 10 得到5,5就是它的个位数字
例如:29 // 10 的结果是2,就是它的十位数字
逻辑运算符
当需要对多个条件进行判断时,可以使用逻辑运算符
and 所有条件都成立时,整个判断才成立
or 只要有一个条件成立,整个判断就成立
既是3的倍数,也是5的倍数
if i % 3 == 0 and i % 5 == 0:
2的倍数,或者5的倍数
if i % 2 == 0 or i % 5 == 0:
枚举法进阶
枚举法
将枚举的范围逐一列举出来,按照筛选条件逐一进行筛选,最后得到答案的方法。
如何列举枚举范围
如果枚举的范围是有规律的数字,可以直接使用for i in range()
逐一列举。
如果枚举的范围不能直接得到,需要先理清得到枚举范围的思路,再把思路转为代码。
【例】 兔子4元一只,鸭子3元一只,刚好花完10元钱,可以买几只兔子和几只鸭子?
【思路】 因为只有10元,所以兔子最多只能买两只,鸭子最多只能买3只。
【列表】列出所有可能的情况,并判断是否满足条件:
兔子 | 鸭子 | 总金额 | 是否满足条件 |
1 | 1 | 7 | 否 |
1 | 2 | 10 | 是 |
1 | 3 | 13 | 否 |
2 | 1 | 11 | 否 |
2 | 2 | 14 | 否 |
2 | 3 | 17 | 否 |
【代码】
for i in range(1, 3):
for j in range(1, 4):
if i * 4 + j * 3 == 10:
print('兔子:',i, '鸭子:', j)
遍历列表
要想逐一得到列表中的元素,可以使用for语句遍历列表。
【格式】for 变量 in 列表:
每次循环,循环变量的值就依次为列表中的元素。
blue = ['scratch', 'python', 'C++']
for b in blue:
print(b)
运行结果
scratch
python
C++
要在列表的所有元素前,都拼接上字符串’hi,’
可以先遍历列表,然后每得到一个元素,就在它前面拼接上字符串。
blue = ['scratch', 'python', 'C++']
for b in blue:
s = 'hi,' + b
print(s)
运行结果
hi, scratch
hi, python
hi, C++
字符串索引
字符串中的每一个字符都有一个索引值。
其中,索引是从0开始,依次变大1.
使用字符串[索引]
的形式,可以得到字符串中的字符。
字符串和列表的相似之处:
索引都是从0开始,依次变大1。
使用字符串[索引] 可以得到字符串中的字符:
使用 列表[索引] 可以得到列表中的元素。
字符串和列表的不同:
列表可以通过 列表[索引]=值的方式修改列表元素。
字符串中的字符不能被修改,使用字符串[索引]=值时程序会报错。
组合问题
要把两个列表中的元素两两进行组合,可以使用for循环嵌套。
blue = ['嘻嘻', '痴痴']
red = ['哈嘿', '痴想', '嘻笑']
for b in blue:
for r in red:
p= b + r
print(p)
枚举法应用
枚举
枚举:就是将结果一一列举出来。在使用枚举之前,需要先确定好枚举的范围。
调料组合
【思考】假设烤鸡的美味程度是所有配料的克数之和,那么要做出指定美味度的烤鸡,该如何组合调料呢?
【例1】使用奥尔良酱和胡椒各1-5g制作出美味度为8的烤鸡
for i in range(1,6):
for j in range(1,6):
if i + j == 8:
print(i, j)
【例2】使用黄油1-4g,蜂蜜1-6g和苹果汁1-8g制作出美味度 为15的烤鸡
for i in range(1,5):
for j in range(1,7):
for k in range(1, 9):
if i + j == 8:
print(i, j)
【总结】
枚举两种调料的组合,使用2层for循环
枚举三种调料的组合,使用3层for循环
采购方案
【思考】 用12枚金币采购蜂蜜和奥尔良酱,其中每瓶蜂蜜需要2枚金币,每瓶奥尔良酱4枚金币。那么,蜂蜜和奥尔良酱各买几瓶,可以把金币正好花完?(注意两种都要买哦)
蜂蜜的单价是2枚金币,如果12枚金币都用来买蜂蜜, 那么最多可以买6瓶;蜂蜜的采购范围是1-6;
奥尔良酱的单价是4枚金币,如果12枚金币都用来买蜂 蜜,那么最多可以买3瓶;奥尔良酱的采购范围是1-3;
for i in range(1,7):
for j in range(1,4):
if i * 2 + j * 4 == 12:
print(i, j)
【总结】 有时,枚举的范围没有直接给出,我们需要根据题目中的信息来计算
金币分配方案
【思考】 禾木和乌拉乎共收入了12枚金币,每个人都要分至少3枚金币,使用枚举法打印出所有的分配方案吧
【解法一】
根据最少3枚,最多12枚来枚举
for i in range(3,13):
for j in range(3,13):
if i + j == 12:
print(i, j)
这种方法中,循环变量 i 和 j 都有10个值,条件判断会执行10*10=100次
【解法二】缩小枚举范围
假如乌拉乎得到了最少的3枚金币,那禾木最多能得到9枚金币,反过来也一样。因此每个人的金币数量是3到9枚。
for i in range(3,10):
for j in range(3,10):
if i + j == 12:
print(i, j)
这种方法中,循环 变量 i 和 j 都有7个值,条件判断会执行7*7=49次
【总结】
有时,可以利用题目的信息来缩小枚举范围,这样可以提高筛选速度~
鸡兔同笼
大约一千五百年前,我国古代数学名著《孙子算经》中记载了一道“鸡兔同笼”的问题:
“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”
数千年过去了,我们已经学会使用计算机来帮忙完成一些数学计算,那么如何用Python来解决鸡兔同笼问题呢?
【题目翻译】笼子里有若干只鸡和兔,从上面数有35个头,从下面数有94只脚,问鸡和兔各有几只?
【分析】首先确定循环的边界:全部为兔,最多23只,全部为鸡47只。兔的边界小比鸡的边界小的多,我们从兔开始枚举。
for t in range(24):
if 4*t + 2*(35-t) == 94:
print('兔:',t, '只 /', '鸡:', 35-t, '只')
运行结果
兔: 12只 / 鸡: 23只