Python算法100例-1.5 借书方案知多少

2024-02-11 06:44

本文主要是介绍Python算法100例-1.5 借书方案知多少,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.完整的程序
  • 5.问题拓展

1.问题描述

小明有5本新书,要借给A、B、C三位小朋友,若每人每次只能借1本,则可以有多少种不同的借法?

2.问题分析

本题属于数学中常见的排列组合问题,即求从5个数中取3个不同数的排列组合的总数。我们可以将5本书进行1~5编号,A、B、C三个人每次都可以从5本书中任选1本,即每人都有5种选择,由于1本书不可能同时借给一个以上的人,因此只要这三个人所选书的编号不同,则即为一次有效的借阅方法。

3.算法设计

对于每个人所选书号,我们可以采用穷举循环来实现,即从每个人可选书号(1、2、3、4、5)的范围内进行穷举,从而得到可行的结果。对于第一个人的选择,可以用循环将其列出,即for a in range(1,6)。同理,对于第二个人、第三个人可以用同样的方法。由于一本书只能借给一个人,故第二个人的选择会受到第一个人的限制,最后一个人的选择会受到第二个人的限制,即后面的选择都是在前面选择的前提下进行的,所以可采用循环的嵌套来解决问题。

利用循环解决问题的时候,找到循环的三要素,即循环变量的初值、循环的控制条件和使循环趋于结束的循环变量值的改变是进行编程的关键。读者可参照1.4节的例子来找一下本题中所对应的循环三要素。本题的输出结果有一个条件限制:三个人所选书号各不相同。这在输出语句前只要用一个if语句“if a != b and a != c and c != b”进行判断即可。

4.完整的程序

根据上面的分析,编写程序如下:

%%time
# 借书方案知多少if __name__=="__main__":#A、B、C三位小朋友,5本书,每人每次只能借一本#用a、b、c分别表示三人所选图书的编号i = 0                                                                   # i表示有效借阅次数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 c != b:print("A:%2d  B:%2d  C:%2d    " %(a, b, c) ,  end='')i += 1if i % 4 == 0:print()                             #换行print("共有%d种有效借阅方法" %i)
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种有效借阅方法
CPU times: user 1.21 ms, sys: 0 ns, total: 1.21 ms
Wall time: 1.21 ms

5.问题拓展

如果前两个人所选书号相同,那么无论第三个人所选书号与前两人相同与否都是无效的借阅方法。因此在执行第三个循环之前可先判定前两人的编号是否相同,进而提高程序效率。实现代码如下:

%%time
# 借书方案知多少
if __name__=="__main__":# A、B、C三位小朋友,5本书,每人每次只能借一本# 用a、b、c分别表示三人所选图书的编号i = 0                                                                   # i表示有效借阅次数print("A,B,C三人所选书号分别为:")a = 1while a <= 5:b = 1while b <= 5:c = 1while c <= 5 and a != b:if a != c and b != c:               # 控制有效借阅组合print("A:%2d  B:%2d  C:%2d    " % (a, b, c), end='')i += 1if i % 4 == 0:print()                             # 换行c += 1b += 1a += 1print("共有%d种有效借阅方法" % i)

对原程序稍做修改之后,在长度上虽没有改进,仍有三层循环,但是在程序的执行效率上有了很大的提高。对于原程序中的第三层循环来说,不管a和b的取值是否相同,循环都要重复进行5次;而修改后的程序在进入循环体之前首先判断a和b的取值,如果两者取值相同,则内层循环无须重复执行5次便可结束。本题的数据较小,在处理数据很大的问题时使用该方法效率的提高会更加明显。

这篇关于Python算法100例-1.5 借书方案知多少的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699105

相关文章

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我