连续正整数之和-第12届蓝桥杯省赛Python真题精选

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

连续正整数之和,本题是2020年12月20日举办的第12届蓝桥杯青少组Python编程省赛真题,第12届一共有两场省赛,这是第一场。题目要求编程统计连续正整数之和相同的组合数量。

先来看看题目的要求吧。

一.题目说明

提示信息:

从1到10000的连续正整数,其中有多组连续的正整数之和相同。

例如:2,3,4和4,5这两组连续正整数之和都为9。

编程实现:

输入一个正整数S,输出从1到10000连续的正整数中,有多少组连续正整数之和为S。(一组连续正整数最少为两个正整数)例如:输入为9,其中2,3,4和4,5这两组连续正整数之和都为9,则输出2。

输入描述:

输入一个正整数S

输出描述:

输出有几组连续的正整数之和为S

样例输入:

9

样例输出:

2

二.思路分析

这是一道和数学相关的计算题,考查的知识点主要包括循环、条件和枚举算法。

针对本题,通常有如下3种解决方案:

  • 暴力枚举

  • 前缀和算法

  • 数学方法

先来探讨第一种方案,暴力枚举。

这里的关键词是连续正整数,假设存在一组连续的正整数,从 k 开始,一共有n个,如下:

k, k + 1, k + 2, ... k + n - 1  

将它们累加起来,看看是否等于S,如果相等,说明找到了一个组合,然后从 k + 1开始,寻找下一组数据。

在累加过程中,一旦和 > S,则立刻结束累加,然后从 k + 1开始,寻找下一组数据。

所以,解决问题的核心在于累加求和,一般情况下,直接使用循环求和即可,这是最直接的解决方案,也就是暴力枚举的解决思路。

但是,由于要寻找所有可能的组合,这就意味着求和需要重复执行多次,如何提升代码的效率呢?

这就引出了第二种方案,前缀和算法。

前缀和算法是一种常用的优化技术,用于解决涉及连续数据求和的问题。它基于一个简单但强大的思想,通过提前计算并存储列表的前缀和,以便在后续查询中可以快速获取任意区间的和

我们看一个例子,如图:

图片

有了前缀和列表,要计算连续区间和,只需要确定区间的起点i和终点j,将两者的前缀和相减即可。

这样就避免了重复求和的过程,可以理解为这是带记忆(备忘录)的求和方法,可以极大地提升算法效率。

至于第三种方法--数学方法,就是直接利用数学中的求和公式,直接求和,这里就不介绍了。

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

三.编程实现

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

  • 暴力枚举

  • 前缀和算法

1. 暴力枚举

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

图片

代码其实是比较简单的,说明4点:

1). 这是典型的嵌套循环,外层是for循环,用于确定数字的起点,也就是k的值,内层是while循环,用于求解从k开始的连续正整数和;

2). 注意for循环的终点,由于题目限定了正整数的范围是1~10000,所以当s < 10000时,终点设为s即可,这样可以减少大量不必要的计算,当s >= 10000时,终点就是10000,这里使用了Python独特的if...else赋值语句;

3). 每一次设置好起点后,需要将total(表示和)的初始值设置为0;

4). while循环的条件是 total < s,当total == s时,说明找到一个组合,cnt加1。

2. 前缀和算法

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

图片

代码不多,也说明3点:

1). presum用于保存1~10000之间所有数字的前缀和,下标和数字一一对应;

2). j的初始值为i+1,确保至少有两位连续整数;

3). 在循环中,当presum[j] - presum[i] > s,就结束内层循环,从而减少不必要的循环。

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

四.总结与思考

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

  • 循环语句,包括for和while;

  • 条件语句;

  • 枚举算法;

  • 列表的使用;

这是本次省赛的最后一题,难度中等,关键是要理清思路,快速找到解决方案。

暴力枚举是最简单的算法,也是计算机解决大部分问题的基础方法。但是我们不能仅仅停留在暴力枚举层面,随着数据规模的增加,枚举的效率会急剧地降低。

因此,我们更要思考如何聪明的枚举,如何高效的枚举,针对不同的问题采取不同的策略,于是就产生了各种各样的算法。

本题中采取的前缀和就是一个典型的例子,通过预处理列表,计算出每个位置的前缀和,并将其保存在一个额外的列表中。

这样,在查询时,我们只需要简单地减去两个前缀和即可得到所需子列表的和,从而将查询时间降低为O(1)的常数复杂度,这是一种典型的用空间换时间的策略。

超平老师给你留一道思考题,如果使用数学方法,该如何解决这个问题呢?

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏黑灰产识别和溯源取证

参考&#xff1a;游戏黑灰产识别和溯源取证 1. 游戏中的黑灰产 1. 黑灰产简介 黑色产业&#xff1a;从事具有违法性活动且以此来牟取利润的产业&#xff1b; 灰色产业&#xff1a;不明显触犯法律和违背道德&#xff0c;游走于法律和道德边缘&#xff0c;以打擦边球的方式为“…

什么是区块链?什么是X314协议?

X314协议是一种基于区块链技术的分布式账本协议&#xff0c;具有去中心化、安全性高和可扩展性强的特点。本文将从多个角度对X314协议进行通俗解释&#xff0c;带您了解这一前沿技术。 一、什么是区块链和分布式账本&#xff1f; 首先&#xff0c;我们需要了解什么是区块链和分…

Linux 引导过程与服务控制

Linux操作系统引导过程 完整启动过程 简化紧要关键步骤&#xff08;重点&#xff09; Linux系统开机引导过程&#xff1a; 1&#xff09;开机自检 检测硬件设备&#xff0c;找到能够引导系统的设备&#xff0c;比如硬盘 2&#xff09;MBR引导 运行MBR扇区里的主…

ASP.NET MVC中Filter过滤器的使用

MVC Filter是典型的AOP&#xff08;面向切面编程&#xff09;应用&#xff0c;在ASP.NET MVC中的4个过滤器类型&#xff0c;如下&#xff1a; 但是默认实现它们的过滤器只有三种&#xff0c;分别是ActionFilter&#xff08;方法&#xff09;&#xff0c;Authorize&#xff08;授…

Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路

背景介绍 Rust 是一种多范式、通用的编程语言&#xff0c;强调性能、类型安全和并发性。它通过一个称为“借用检查器”的机制在编译时追踪所有引用的对象生命周期&#xff0c;以强制实现内存安全&#xff0c;即确保所有引用都指向有效的内存&#xff0c;而不需要垃圾收集器。 …

小程序中使用HTTPS调用自带文本安全内容检测接口(msg_sec_check)的实现方法

在小程序中调用自带的文本安全内容检测接口&#xff0c;你需要使用小程序提供的wx.request方法。以下是一个示例代码&#xff1a; javascript代码: // 假设你已经获取了access_token,如果不知道如何获取&#xff0c;可以参考我上一篇文章 const access_token 你的access_tok…

JS 删除数组元素( 5种方法 )

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、五种…

QT中文乱码常见解决办法

QT中出现中文字符串乱码情况时(如图示), 可尝试下面的几种方法: 1、QString str QStringLiteral("1你好世界 hello world")); //推荐2、QString str QObject::tr("2你好世界 hello world")); //推荐国际化场景使用3、QString str QString::fromU…

Linux内核驱动开发-001字符设备开发-003独立按键杂项驱动

1驱动程序 /*************************************************************************> File Name: key_misc.c> Author: yas> Mail: rage_yashotmail.com> Created Time: 2024年04月22日 星期一 17时20分42秒**********************************************…

DBA-现在应该刚刚入门吧

说来话长 在2023年以前&#xff0c;我的DBA生涯都是“孤独的”。成长路径除了毕业前的实习期有人带&#xff0c;后续几乎都是靠自学。如何自学&#xff0c;看视频、看文档、网上查阅资料、项目实战。 可能是学疏才浅 &#xff0c;一直都是在中小公司混&#xff0c;在中小公司通…

30V-STM32设计项目

30V-STM32设计 一、项目描述 (已验证) 基于STM32c8t6芯片设计的开发板&#xff0c;支持4-30V宽电压输入&#xff0c;串口模式自动下载功能&#xff0c;支持串口和STlink&#xff0c;方式下载程序 二、原理图介绍 电源电路采用了DCDCLDO电路&#xff0c;如果是外接DC头供电的话&…

GELU激活函数

Gaussian Error Linerar Units(GELUS) 论文链接&#xff1a;https://arxiv.org/abs/1606.08415 在激活函数领域&#xff0c;鄙视链应该是&#xff1a;Elus > Relu > Sigmoid &#xff0c;这些激活函数都有自身的缺陷&#xff0c; sigmoid容易饱和&#xff0c;Elus与Rel…