第十四届蓝桥杯python省赛题第3题编程题

编程实现:
小明收藏了N(2≤N≤25)个数字币,每个数字币上都有一个面值(面值可以重复)。从数字币中任选K(2≤K≤N)个,有多种选法,请将每次选择的数字币上的面值累加,然后解决以下两个问题。
问题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。
输入描述
第一行输入一个正整数N(2≤N≤25),表示数字币的个数。
第二行输入N个正整数(1≤正整数≤1000),表示数字币上的面值,正整数之间以一个英文逗号隔开。
第三行输入一个正整数K(2≤K≤N),表示所要选取的数字币个数。
输出描述
输出两个整数,分别表示累加的和中不同结果的个数以及累加的结果中不同合数的个数,两个整数之间以一个英文逗号隔开。
样例输入
5
2,1,4,5,3
3
样例输出
7,5

本道题的难度还是比较高,一是排序组合限制,通过k去控制应该互相累加几次;二是合数,合数这个知识点比较难,要明白什么是合数;

合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。

合数特性:
1、除0以外,所有大于2的偶数都是合数。
2、所有大于5的奇数中,个位为5的都是合数。
3、最小的(偶)合数为4,最小的奇合数为9。
4、每一个合数都可以以唯一形式被写成质数的乘积,即分解质因数。(算术基本定理)

解题思路:
1、通过k去解决排序组合,这里可以采用枚举算法去解决,当然也可以使用combinations排列组合。

n=int(input())
a=list(map(int,input().split(",")))
K=int(input())
A=[]##存放和的结果
for i in range(len(a)):
    for j in range(i+1,len(a)):
        b = a[i]  ##累加和
        k = K - 1##b=a[i]已经提前加过一次,所以k-1;
        for z in range(j,len(a)):##这里借用了第三重循环,当k=3以及上时,每次都要往回退一次,三重循环很好保证,每个情况都会加起来
            b += a[z]
            k -= 1
            if k == 0:
                if b not in A:##判断b累加的结果是否重复
                    A.append(b)
                b -= a[z]##往回退一次
                k += 1##往回退一次,同时增加k的次数

2、通过合数特性,去写好的对于的判断条件。

c=0
for i in range(len(A)):
    if (A[i]%2==0 and A[i]!=2) or (A[i]%2!=0 and A[i]%10==5) or A[i]==9:
        c+=1

3、程序集合

n=int(input())
a=list(map(int,input().split(",")))
K=int(input())
A=[]##存放和的结果
for i in range(len(a)):
    for j in range(i+1,len(a)):
        b = a[i]  ##累加和
        k = K - 1##b=a[i]已经提前加过一次,所以k-1;
        for z in range(j,len(a)):##这里借用了第三重循环,当k=3以及上时,每次都要往回退一次,三重循环很好保证,每个情况都会加起来
            b += a[z]
            k -= 1
            if k == 0:
                if b not in A:##判断b累加的结果是否重复
                    A.append(b)
                b -= a[z]##往回退一次
                k += 1##往回退一次,同时增加k的次数
c=0
for i in range(len(A)):
    if (A[i]%2==0 and A[i]!=2) or (A[i]%2!=0 and A[i]%10==5) or A[i]==9:
        c+=1
print(max(A))

4、本道题还可以使用combinations库函数进行排序组合解题,方法会相对于枚举算法会解决一点.。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ha___。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值