【蓝桥杯省赛真题52】python连续正整数和 第十五届蓝桥杯青少组Python编程省赛真题解析
python连续正整数和
第十五届蓝桥杯青少年组python比赛省赛真题详细解析
博主推荐
- 所有考级比赛学习相关资料合集【推荐收藏】
1、Python比赛
-
信息素养大赛Python编程挑战赛
-
蓝桥杯python选拔赛真题详解
-
蓝桥杯python省赛真题详解
-
蓝桥杯python国赛真题详解
2、Python考级
-
python等级一级真题解析【电子学会】
-
python等级二级真题解析【电子学会】
-
python等级三级真题解析【电子学会】
-
python等级四级真题解析【电子学会】
一、题目要求
(注:input()输入函数的括号中不允许添加任何信息)
1、编程实现
给定一个正整数 n,请计算n最多可以由多少个连续(2个及以上)的正整数相加得到,如果n不能由连续的正整数相加得到,则输出-1。
例如:n=100;100 可以由以下2组连续的正整数相加得到。
第一组:9、10、11、12、13、14、15、16;
第二组:18、19、20、21、22;
100 最多可以由 8个连续的正整数相加得到,输出8。
例如:n=8, 8不能由连续的正整数相加得到,输出-1。
2、输入输出
输入描述:只有一行,一个正整数n(3≤n≤10^8)
输出描述:只有一行,一个整数,表示 n最多可以由多少个连续的正整数相加得到;如果n不能由连续的正整数相加得到,则输出 -1。
输入样例:
100
输出样例:
8
二、算法分析
- 目标:输入n,得到最多可以由多少个连续的正整数相加
- 策略:可以先分析一下连续正整数相加的规律,如果有i个连续的正整数相加,起始数字为k,可以表示为:n=k+(k+1)+(k+2)+...+(k+i-1)
- 将上面等式化简可以得到:i * (2k + i - 1) / 2 = n,进而得到:2n=i * (2k + i -1)
- 由于k是整数,所以2k+i-1大于i,所以2n>i*i,得到 i<sqrt(2n)
- 接着就可以遍历每个i从2开始一直到sqrt(2n),检查
(2n-i*(i-1))
是否能被2i
整除,并且满足除完之后为正整数,如果找到这样的i就是满足条件的,否则输出-1
本文作者:小兔子编程 作者首页:小兔子编程-CSDN博客
三、程序编写
n = int(input())
res = -1
m = int((2 * n) ** 0.5)
for i in range(2, m + 1):num = 2 * n - i * (i - 1)if num <= 0:breakif num % (2 * i) == 0:k = num // (2 * i)if k > 0:res = i
print(res)
四、程序说明
- 利用input输入函数从键盘获取输入数据
- 利用int函数将n转换成整数类型
- 利用数学求和公式得到i的最大取值为2n的开平方
- 连续求和的个数必须是从2个数开始
- 利用for循环遍历连续求和的个数,从2开始到最大
- 接着num是由求和公式变形而来,得到的是分子,必须是大于0,同时对应的分母就是2*i
- 所以必须满足能被整除,最后只要整除的数字大于0,则最大的个数就是i
- 利用分支语句if对数字进行校验是否满足条件
- 最后通过print函数输出即可
五、运行结果
100
83
2
六、考点分析
难度级别:难,这题相对小朋友们来说有一定的难度,难在数学公式的应用,具体主要考查如下:
- 学会分析题目,找到解题思路
- 学会简单的算法知识的应用
- input函数:Python 中 input() 函数接受一个标准输入数据,返回为 string 类型。
- int函数:强制将传入对象转换成整数类型
- 学会数学求和公式的使用,以及相应变形公式的应用
- 学会for循环的使用:for循环可以遍历任何有序的项及列表元素等等。
- range函数:rang(a,b),循环的时候是不包括b的,所以我们这个案例中要转变一下,要想包含b,就应该写成range(a,b+1)
- 学会if...条件判断语句的使用:满足条件才执行相应的程序
- print函数:用于打印输出,最常见的一个函数。
- 充分掌握for循环和数学求和公式及分支语句的使用
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!