问题描述
小明有5本书,要借给A,B,C三位小朋友,若每人只能借1本,则可以有多少种不同的借法?
问题分析
从5个数中取3个不同的数的排列组合,同时由于一本书不能借给一个以上的人,因此只有三人所选的编号必须不同。
算法设计
依然用穷举循环方法实现,根据条件限制 if a!=b and a!=c and c!=b 进行判断。
另外performance版本,如果前两个人所选书号相同,无论第三个人所选书号与前两个人相同与否,都是无效的借阅方法。可在执行第三个循环之前先判定前两个人的编号是否相同,进而提高效率。
Code
Basic verison
# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 借书方案
import time
# add timer to calculate the performance
# Basic performance
###############################################################
start = time.time()
if __name__=='__main__':
# A,B,C三位小朋友,5本书,每人每次只能借一本
# 用a,b,c分别表示三人所选图书的编号
i=0 #i表示有效借阅次数
print('A,B,C三人所选书号分别为:')
for a in range(1,6): #用来控制A借阅图书的编号
for b in range(1,6):
for c in range(1,6):
if a!=b and a!=c and c!=b:
print('A:%2d B:%2d C:%2d ' %(a,b,c),end='')
i+=1
if i%4==0:
print() #加换行
print('共有%d种有效借阅方法' %i)
end = time.time()
print("The Basic Runtime is {0}".format((end-start)))
结果:
A,B,C三人所选书号分别为:
A: 1 B: 2 C: 3 A: 1 B: 2 C: 4 A: 1 B: 2 C: 5 A: 1 B: 3 C: 2
A: 1 B: 3 C: 4 A: 1 B: 3 C: 5 A: 1 B: 4 C: 2 A: 1 B: 4 C: 3
A: 1 B: 4 C: 5 A: 1 B: 5 C: 2 A: 1 B: 5 C: 3 A: 1 B: 5 C: 4
A: 2 B: 1 C: 3 A: 2 B: 1 C: 4 A: 2 B: 1 C: 5 A: 2 B: 3 C: 1
A: 2 B: 3 C: 4 A: 2 B: 3 C: 5 A: 2 B: 4 C: 1 A: 2 B: 4 C: 3
A: 2 B: 4 C: 5 A: 2 B: 5 C: 1 A: 2 B: 5 C: 3 A: 2 B: 5 C: 4
A: 3 B: 1 C: 2 A: 3 B: 1 C: 4 A: 3 B: 1 C: 5 A: 3 B: 2 C: 1
A: 3 B: 2 C: 4 A: 3 B: 2 C: 5 A: 3 B: 4 C: 1 A: 3 B: 4 C: 2
A: 3 B: 4 C: 5 A: 3 B: 5 C: 1 A: 3 B: 5 C: 2 A: 3 B: 5 C: 4
A: 4 B: 1 C: 2 A: 4 B: 1 C: 3 A: 4 B: 1 C: 5 A: 4 B: 2 C: 1
A: 4 B: 2 C: 3 A: 4 B: 2 C: 5 A: 4 B: 3 C: 1 A: 4 B: 3 C: 2
A: 4 B: 3 C: 5 A: 4 B: 5 C: 1 A: 4 B: 5 C: 2 A: 4 B: 5 C: 3
A: 5 B: 1 C: 2 A: 5 B: 1 C: 3 A: 5 B: 1 C: 4 A: 5 B: 2 C: 1
A: 5 B: 2 C: 3 A: 5 B: 2 C: 4 A: 5 B: 3 C: 1 A: 5 B: 3 C: 2
A: 5 B: 3 C: 4 A: 5 B: 4 C: 1 A: 5 B: 4 C: 2 A: 5 B: 4 C: 3
共有60种有效借阅方法
The Basic Runtime is 0.0
Performance version
# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 借书方案
import time
# add timer to calculate the performance
# Basic performance
###############################################################
start = time.time()
if __name__=='__main__':
# A,B,C三位小朋友,5本书,每人每次只能借一本
# 用a,b,c分别表示三人所选图书的编号
i=0 #i表示有效借阅次数
print('A,B,C三人所选书号分别为:')
a=1
while a<=5:
b=1
while b<=5:
c=1
while c<=5 and a!=b:
if a!=c and b!=c:
print('A:%2d B:%2d C:%2d ' % (a, b, c), end='')
i += 1
if i % 4 == 0:
print() # 加换行
c+=1
b+=1
a+=1
print('共有%d种有效借阅方法' %i)
end = time.time()
print("The Basic Runtime is {0}".format((end-start)))
结果:
A,B,C三人所选书号分别为:
A: 1 B: 2 C: 3 A: 1 B: 2 C: 4 A: 1 B: 2 C: 5 A: 1 B: 3 C: 2
A: 1 B: 3 C: 4 A: 1 B: 3 C: 5 A: 1 B: 4 C: 2 A: 1 B: 4 C: 3
A: 1 B: 4 C: 5 A: 1 B: 5 C: 2 A: 1 B: 5 C: 3 A: 1 B: 5 C: 4
A: 2 B: 1 C: 3 A: 2 B: 1 C: 4 A: 2 B: 1 C: 5 A: 2 B: 3 C: 1
A: 2 B: 3 C: 4 A: 2 B: 3 C: 5 A: 2 B: 4 C: 1 A: 2 B: 4 C: 3
A: 2 B: 4 C: 5 A: 2 B: 5 C: 1 A: 2 B: 5 C: 3 A: 2 B: 5 C: 4
A: 3 B: 1 C: 2 A: 3 B: 1 C: 4 A: 3 B: 1 C: 5 A: 3 B: 2 C: 1
A: 3 B: 2 C: 4 A: 3 B: 2 C: 5 A: 3 B: 4 C: 1 A: 3 B: 4 C: 2
A: 3 B: 4 C: 5 A: 3 B: 5 C: 1 A: 3 B: 5 C: 2 A: 3 B: 5 C: 4
A: 4 B: 1 C: 2 A: 4 B: 1 C: 3 A: 4 B: 1 C: 5 A: 4 B: 2 C: 1
A: 4 B: 2 C: 3 A: 4 B: 2 C: 5 A: 4 B: 3 C: 1 A: 4 B: 3 C: 2
A: 4 B: 3 C: 5 A: 4 B: 5 C: 1 A: 4 B: 5 C: 2 A: 4 B: 5 C: 3
A: 5 B: 1 C: 2 A: 5 B: 1 C: 3 A: 5 B: 1 C: 4 A: 5 B: 2 C: 1
A: 5 B: 2 C: 3 A: 5 B: 2 C: 4 A: 5 B: 3 C: 1 A: 5 B: 3 C: 2
A: 5 B: 3 C: 4 A: 5 B: 4 C: 1 A: 5 B: 4 C: 2 A: 5 B: 4 C: 3
共有60种有效借阅方法
The Basic Runtime is 0.001001596450805664