一、问题描述
小明有5本新书,要借给A、B、C三位小朋友,若每个人每次只能借一本书,则有多少种不同的有效借法?
二、问题分析
- 典型的排列组合问题;
- 从5个数中提取出3个不同的排列组合的总数。
三、算法设计
- 每个人所选的书号可以通过穷举法循环来实现;
- 即从(1,2,3,4,5)的范围内内进行穷举;
- 循环嵌套实现上述逻辑;
- 限制条件:书号不能相同。
四、代码实现
1、原始代码
(1) 代码
# 用a、b、c分别表示三人所选的图书的编号 i = 0 print("A、B、C三人所选的书号分别为: ") # 用来控制A借阅图书的编号 for a in range(1,6): # 用来控制B借阅图书的编号 for b in range(1,6): # 用来控制C借阅图书的编号 for c in range(1,6): if a!=b and a!=c and b!=c: print("A:%2d B:%2d C:%2d" %(a,b,c), end= '') i += 1 if 1 % 4 == 0: print() print("共有%d种有效的借阅方法" % i)
(2) 运行结果
2、算法优化
- 如果前面两个人所选的书号相同,那么无论第三个人所选的书号与前面两人相同与否都是无效的借阅方法。
- 在执行第三个循环之前可以先判定前两个编号是否相同。
3、优化代码
(1) 代码
i = 0 print("A、B、C三人所选的书号分别为: ") a = 1 while a <= 5: b = 1 while b <= 5: c = 1 while c <= 5: if a!=c and b!=c: # 控制有效借阅组合 print("A:%2d B:%2d C:%2d" %(a,b,c), end= '') i += 1 if 1 % 4 == 0: print() c += 1 b += 1 a += 1 print("共有%d种有效的借阅方法" % i)
(2) 运行结果