正整数分解-第12届蓝桥杯省赛Python真题精选

news2025/1/9 1:04:22

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第54讲。

正整数分解,本题是2020年12月20日举办的第12届蓝桥杯青少组Python编程省赛真题,第12届一共有两场省赛,这是第一场。题目要求将输入的正整数N分解成3个各不相同的正整数,并且不包含数字2和4。

先来看看题目的要求吧。

一.题目说明

编程实现:

输入一个正整数N(10 < N < 1000),然后将N分解成3个各不相同的正整数,即3个正整数之和为N。且要求每个正整数中都不包含数字2和4,输出一共有多少种不同的分解方法。

例如:输入的正整数N为12

将12分解为3个不同的正整数,且每个正整数都不包含数字2和4为:1,3,8和1,5,6。一共有两种分解方法。

注意:数字相同顺序不同的算一种分解方法。

输入描述:

输入一个正整数N(10 < N < 1000)

输出描述:

输出一共有多少种不同的分解方法

样例输入:

12

样例输出:

2

二.思路分析

这是一道排列组合题,考查的知识点主要包括循环、条件、字符串运算和枚举算法。

针对组合问题,在Python编程中一般有如下两种解决方案

  • 枚举算法

  • 使用combinations()组合函数

先来讨论枚举算法的实现方案,为了方便理解,我们通过两个实例来演示枚举的过程。

先以数字N = 12为例,将12拆分成3个互不相同的正整数,以1开头的有4种,如下:

1, 2, 91, 3, 81, 4, 71, 5, 6

以2开头的有2种,如下:​​​​​​​

2, 3, 72, 4, 6

以3开头的有1种,如下:

3, 4, 5

再以数字N = 18为例,将18拆分成3个互不相同的正整数,以1开头的有7种,如下:​​​​​​​

1, 2, 151, 3, 141, 4, 131, 5, 121, 6, 111, 7, 101, 8, 9

以2开头的有5种,如下:​​​​​​​

2, 3, 132, 4, 122, 5, 112, 6, 102, 7, 9

以3开头的有4种,如下:​​​​​​​

3, 4, 113, 5, 103, 6, 93, 7, 8

以4开头的有2种,如下:

4, 5, 94, 6, 8

以5开头的有1种,如下:

5, 6, 7

你发现这里的规律了吗?

如果用i、j、k来表示这3个正整数,可以发现如下3条规律:

1). i < j < k,因为(5, 6, 7)和(6, 5, 7)是相同的组合,只需要考虑前者就可以了;

2). i每次都是从1开始的,到 N // 3结束,这个也比较好理解,如果i,j,k三者相等,那么 i = j = k = N // 3,基于第一条规律,i的最大值也只能是N // 3;

3). j每次都是从 i + 1开始的,到 N // 2结束,这个怎么理解呢,因为j < k,取极端情况,i = 1,j = k,那么i +  j + k = 1 + j + j = N,由此可知,j = (N - 1)// 2。

搞清楚这3条,就可以使用枚举算法,获取所有的组合,然后去掉包含数字2和4的组合。

第二种方案则是直接使用combinations()组合函数,相当于把枚举的活儿交给专业人士来干。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们使用两种方案来编写程序:

  • 枚举算法

  • 组合函数

1. 枚举算法

根据前面的思路分析,我们编写代码如下:

图片

代码不多,说明3点:

1). i和j的最大取值分别是 n // 3、n //2,由于range()函数虎头蛇尾的特点,需要加1;

2). 判断数字中是否包含2和4,最简单的方法就是使用字符串的in运算符,但是需要将整数转成字符串;

3). 对于k的取值,使用循环是可以的,但是直接利用 i + j + k = n的条件,可以省略循环,只需要确保 k > j,并且不包含数字2和4即可,这样可以极大地减少程序循环的次数,提升效率。

2. 组合函数

直接使用combinations()函数,编写代码如下:

代码比较简单,强调3点:

1). 要先导入combinations()函数;

2). combinations()函数的第一个参数是可迭代对象,这里使用range()函数生成了1到n之间的整数序列,这个范围也可以缩小到(n - 2),因为i最小值是1,j最小值为2;

3). combinations()函数返回的是元组,直接使用sum()函数对元组求和,同时过滤掉包含2和4的组合。

至此,整个程序就全部完成了,你可以输入不同的数字来测试效果啦

四.总结与思考

本题代码在12行左右,涉及到的知识点包括:

  • 循环语句,尤其是嵌套循环;

  • 条件语句;

  • 字符串运算;

  • continue语句;

  • 枚举算法;

这是本次省赛的第5题,难度中等。关键点有两个,一是如何获取所有的组合,二是如何过滤掉包含数字2和4的组合。

其中,对于组合的获取,在Python编程中,常见的方案就是循环枚举和组合函数。

对于枚举算法,需要根据实际情况来确定循环的层数,同时要对程序进行优化。包括两个方面,一是减少循环的层数,二是减少每一层循环的次数,从而提高程序的效率。

对于组合函数而言,这是Python给我们的小惊喜,尤其是combinations()和permutations()函数。真的是太好用了,能有就有,该用就用,可不要辜负了Python的一番美意。

超平老师给你留一道经典的算法入门题,看看你能否解决:


给你一个整数数组nums ,判断是否存在三元组[nums[i], nums[j], nums[k]]

满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为0且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang 开发实战day11 - Pass By Value

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day11 - 按值…

如何阻止访问您的网站

本周有一个客户&#xff0c;购买Hostease的HK Basic Linux虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何阻止部分地区或IP段访问他的网站。我们为用户提供教程&#xff0c;用户很快完成了设置。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您有帮助…

管理 nodejs 版本工具 nvm

nvm 方便切换不同版本的 node 及 对应的 npm 版本 一、安装nvm nvm官网 &#xff08;内含下载的文件&#xff0c;点击进去下载&#xff0c;并按照 网站文档步骤 操作即可&#xff09; 二、nvm 基础命令 nvm arch&#xff1a;显示node是运行在32位还是64位。nvm install <…

网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)

网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 &#xff08;1&#xff09;用户注册界面 &#xff08;2&#xff09;用户登录界面 &#xff08;3&#xff09;菜品详情界面 &#xff08…

随动系统同步性问题(跟随给定和跟随反馈的区别)

1、运动控制比例随动 运动控制比例随动系统_正运动随动系统-CSDN博客文章浏览阅读1.4k次,点赞2次,收藏5次。PLC如何测量采集编码器的位置数据,不清楚的可以参看我的另一篇博文:三菱FX3U PLC高速计数器应用(附代码)_RXXW_Dor的博客-CSDN博客本文主要以三菱FX3U系列的高速…

Groovy程序设计-【第一部分Groovy起步】-02-面向Java开发者的Groovy

前言&#xff1a; 知识点记录来源于【Groovy程序设计】一书中&#xff0c;本文仅作知识点记录供日后使用查询&#xff0c;不做教程使用。 groovy支持java语法&#xff0c;并且保留了java的语义&#xff0c;所以我们可以随心所欲的混用两种语言。 1.从Java到Groovy 先看一个…

vr兽医设备操作模拟仿真教学平台提升教学效果

在兽医教育的传统领域中&#xff0c;动物诊疗一直是一项不可或缺的实践环节。然而&#xff0c;传统的解剖教学方式受限于动物数量、种类以及安全隐患&#xff0c;无法充分满足学生的学习需求。随着VR虚拟仿真技术的不断精进&#xff0c;VR动物诊疗仿真实训系统为兽医教育带来了…

数字藏品app开发

数字藏品是指使用区块链技术&#xff0c;对应特定的作品、艺术品生成的唯一数字凭证。在保护其数字版权的基础上&#xff0c;数字藏品实现了真实可信的数字化发行、购买、收藏和使用。数字藏品是数字出版物的一种新形态&#xff0c;具有唯一的IP数字身份和所有权信息&#xff0…

什么是人才测评工具?

人才测评工具是指企业通过一系列科学的手段和方法对人的基本素质及其潜能进行测量和评定的活动。它的具体对象不是抽象的人&#xff0c;而是作为个体存在的人其内在素质及其表现出的绩效。随着经济的发展&#xff0c;企业对人才的渴求日益增加&#xff0c;这也导致各企业单位人…

Java与Kotlin语言的特色之处

一、Java特色之处&#xff1a; 1.多异常捕获 一个try块可能捕获到多个异常&#xff0c;可以使用多个catch块分别处理每个异常&#xff0c;也可以使用一个catch块处理多个异常&#xff08;多个异常使用管道符|分隔&#xff09;。 多个catch块代码&#xff1a; try{ }catch(IOExc…

海外仓管理系统的“实用性”讨论:没办法自由设置信息的,都是伪功能

和很多经营海外仓的企业都聊过这样一个问题&#xff1a;对于海外仓的管理系统&#xff0c;到底什么样的设计&#xff0c;什么样的功能才是真的有价值的。 那这就不得不说到一个概念&#xff1a;自由性。什么意思呢&#xff0c;海外仓看似都一样&#xff0c;大家都在经营仓储、…

基于Springboot+Vue的Java项目-口腔管理平台系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

5种语言实现 | 使用Dijkstra算法从起点到所有节点找到最短路径

编辑&#xff1a;东岸因为一点人工一点智能 5种语言实现 | 使用Dijkstra算法从起点到所有节点找到最短路径C\x5cJava\x5cPython\x5cC#\x5cJavascript&#xff0c;五种语言实现使用Dijkstra算法从起点到所有节点找到最短路径https://mp.weixin.qq.com/s/6NAClr51zR_GLZGyKkr32A…

RTT学习

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。生活中&#xff0c;我们经常会遇到这样…

本地部署运行大模型ollama

本地部署运行大模型ollama ollama模型下载地址 在我使用 vscode 开发时&#xff0c;使用 coplit 或 chatgpt 来辅助过于昂贵&#xff0c;于是我希望找到一个可以调用本地大模型的工具来辅助编程。 ollama 就是这样一个工具。 ollama使用 ollama 是一个可以将训练好的模型部署到…

前端开发攻略---在页面上渲染大量元素,使用defer减少白屏等待时间,优化页面响应速度

1、优化前 2、优化后 3、优化思路 1、在元素数量不变的情况下&#xff0c;进行一步一步的渲染&#xff0c;先渲染一些重要的元素或者需要用户第一时间看到的元素。 2、使用Hooks封装优化函数 4、优化代码 拥有大量元素的组件&#xff08;Item&#xff09;&#xff1a;文件位置&…

嵌入式系统中的嵌入式主板,你了解多少?

嵌入式主板&#xff0c;也称为嵌入式计算机主板&#xff0c;是一种专门设计用于嵌入式系统的计算机主板。与台式机和笔记本电脑中使用的常规主板不同&#xff0c;嵌入式主板设计用于集成到更大的电子设备中&#xff0c;例如汽车、医疗设备或自动售货机。在本文中&#xff0c;我…

C++ ─── 类和对象(构造函数和析构函数)

目录 1.类的6个默认成员函数 2. 构造函数&#xff08;对类进行 “初使化”&#xff09; 2.1 概念 2.2 特性 3.析构函数&#xff08;对类进行 “销毁”&#xff09; 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真…

stable diffusion基本原理

diffusion model latent diffusion &#xff1a;先对图片降维&#xff0c;然后在降维空间做diffusion&#xff1b;stable diffusion即基于此方法实现的&#xff0c;因此计算量很小&#xff1b; 共用降噪网络U-Net&#xff1a;输入noisy imagestep&#xff0c;告诉网络当前的噪声…

Redis入门到通关之Redis缓存数据实战

文章目录 ☃️什么是缓存?❄️❄️为什么要使用缓存❄️❄️如何使用缓存 ☃️缓存实战❄️❄️缓存模型和思路❄️❄️演示代码 ☃️缓存更新策略❄️❄️数据库缓存不一致解决方案 ☃️什么是缓存? 缓存就像自行车,越野车的避震器 举个栗子: 越野车,山地自行车,都拥有&qu…