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版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S