目录
python数字币统计
一、题目要求
1、编程实现
2、输入输出
二、算法分析
三、程序编写
四、程序说明
五、运行结果
六、考点分析
七、 推荐资料
1、蓝桥杯比赛
2、考级资料
3、其它资料
python数字币统计
第十四届蓝桥杯青少年组python比赛省赛真题
一、题目要求
(注:input()输入函数的括号中不允许添加任何信息)
1、编程实现
小明收藏了N(2≤N≤25)个数字币,每个数字而上都有一个面值(面值可以重复)。从数字币中任选K(2≤KN)个,有多种选法,请将每次选择的数字而上的面值累加,然后解决以下两个问题。
问题1:累加的和中有多少种不同的结果;
问题2:累加的和中有多少个不同的合数。
例如:N=5,K=3,5个数字币上的面值分别为2、1、4、5、3,任选3个数字币,有10种选法,将每种选法上的面值累加:2+1+4=7、2+1+5=8、2+1+3=6、2+4+5=11、2+4+3=9、2+5+3=10、1+4+5=10、1+4+3=8、1+5+3=9、4+5+3=12。其中累加的和中有7种不同的结果,分别是7、8、6、11、9、10、12,累加的和中有5个不同的合数,分别是8、6、9、10、12。
提示信息:
合数:合数指自然数中除了能被1和本身整除外,还能被其它正整数整除的数。
例如4,4除了能被1和4整除,还可以被2整除。
2、输入输出
输入描述:第一行输入一个正整数N(2≤N≤25),表示数字币的个数
第二行输入N个正整数(1≤正整数≤1000),表示数字币上的面值,正整数之间以一个英文逗号隔开第三行输入一个正整数K(2≤K≤N),表示所要选取的数字币个数
输出描述:输出两个整数,分别表示累加的和中不同结果的个数以及累加的结果中不同合数的个数,两个整数之间以一个英文逗号隔开
输入样例:
5
2,1,4,5,3
3
输出样例:
7,5
二、算法分析
- 题目相对而言有一定难度,难点1在于数字的排列组合
- 从给定数字n中选取k个数进行组合可以使用 itertools库中的combinations函数
- 难点2在于每种组合的求和结果有可能是相同的,题目要求是不同的求和结果
- 这点可以通过集合set进行实现,set中保留的都是唯一值
- 难点3在于如何判断一个数是合数,可以换个思路,判断一个数是素数
- 素数的反面就是合数,逐个遍历集合set里面的内容然后判断是否是合数即可
三、程序编写
# 导入itertools库中的combinations函数
from itertools import combinations
# 定义一个函数,用于检查一个整数是否为质数
def isPrime(k):
if k<2:
return False
for i in range(2,k):
if k%i == 0:
return False
return True
n = int(input())
ls = list(map(int,input().split(',')))
k = int(input())
# 用combinations函数生成ls中长度为k的所有子集组合,并计算它们的和
# 并将不同的和存储在一个set中(set中的元素都是唯一的)
s = set()
for i in combinations(ls,k):
s.add(sum(i))
res = 0
for i in s:
if not isPrime(i):
res += 1
print('{},{}'.format(len(s),res))
四、程序说明
- 首先导入了itertools模块中的combinations函数,用于生成给定列表中的所有长度为k的子集组合。
- 定义了一个函数isPrime,用于检查一个整数是否为质数。如果小于2,则返回False;否则,依次判断从2到k-1的数字是否能整除k,如果能整除则返回False,否则返回True。
- 通过input函数获取用户输入的整数n,表示列表ls的长度。
- 通过input函数获取用户输入的整数列表ls,并使用split(',')将输入的字符串按逗号分割,并使用map函数将分割后的字符串转换为整数并存储在列表中。
- 通过input函数获取用户输入的整数k,表示需要生成的子集组合的长度。
- 创建一个空的集合s,用于存储不同的子集组合的和。
- 使用combinations函数生成列表ls中长度为k的所有子集组合,并使用sum函数计算每个组合的和,并将和添加到集合s中。
- 创建一个变量res,用于存储不是质数的和的数量,初始值为0。
- 遍历集合s中的每个元素,如果该元素不是质数,则将res加1。
- 使用format函数将len(s)和res格式化成字符串,并用print函数输出。
五、运行结果
5
1,2,3,4,5
3
7,5
六、考点分析
难度级别:中等,这题相对而言还是有一点难度,具体主要考查如下:
- 学会分析题目,找到解题思路
- 学会简单的算法知识的应用
- 学会combinations函数的使用,返回指定个数的子集组合
- 学会set的使用,set是一个无序且不重复的集合数据类型。它类似于数学中的集合。以及add方法的使用
- input函数:Python 中 input() 函数接受一个标准输入数据,返回为 string 类型。
- int函数:强制将传入对象转换成整数类型
- split函数:按照指定的分隔符进行分割
- map函数:将指定的对象按照指定的函数进行迭代,在这里是将时分秒字符串类型数据按int整数类型数字返回输出(相当于多个变量强制类型转化)
- list函数:强制将参数转化成列表对象
- 学会列表的相关操作:列表声明、取数、遍历等等
- 学会for循环的使用:for循环可以遍历任何有序的项及列表元素等等。
- range函数:rang(a,b),循环的时候是不包括b的,所以我们这个案例中要转变一下,要想包含b,就应该写成range(a,b+1)
- 学会if...条件判断语句的使用:满足条件才执行相应的程序
- 充分掌握for循环、列表、集合和自定义函数等相关操作的使用
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!
七、 推荐资料
- 所有考级比赛学习相关资料合集【推荐收藏】
1、蓝桥杯比赛
-
蓝桥杯python选拔赛真题详解
-
蓝桥杯python省赛真题详解
-
蓝桥杯python国赛真题详解
-
历届蓝桥杯科技素养计算思维真题解析
2、考级资料
-
python等级一级真题解析【电子学会】
-
python等级二级真题解析【电子学会】
-
python等级三级真题解析【电子学会】
-
python等级四级真题解析【电子学会】
3、其它资料
-
初学python100例
- 历届蓝桥杯scratch国赛真题解析
- 历届蓝桥杯scratch省赛真题解析
- 历届蓝桥杯scratch STEMA选拔赛真题解析
- 历届蓝桥杯科技素养计算思维真题解析
- 画图-scratch编程考级99图
- 电子学会历年scratch等级考试一级真题解析
- 电子学会历年scratch等级考试二级真题解析
- 电子学会历年scratch等级考试三级真题解析
- 电子学会历年scratch等级考试四级真题解析
- 零基础学习scratch3.0【入门教学 免费】
- 零基础学习scratch3.0【视频教程 114节 免费】