2020-2021年度第⼆届全国⼤学⽣算法设计与 编程挑战赛(冬季赛)——D题

题目详情

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路

由于无限大集合区间不知道怎么取,所以先做有限区间[0,n]的。按照体例给的集合部分示例可以看出,整个大的集合是由两部分组成,一是纯素数的集合A([2], [3], [5], [7], [11]…),二是这些素数的排列组合形成的集合B([2, 3], [2, 5], [2, 7], [2, 11], [3, 5], [3, 7], … , [2, 3, 5], [2, 3, 7], … ),然后将集合B中的每一个元素内部求和SUM(B[i])(如[2, 3]的和为5)后与集合A中的元素对比,如A[j]<SUM(B[i])<=A[j+1](如[2, 3]插入到A中的[3]和[5]之间),则将B[i]插入到集合A的j+1位置。最终得到题目中的集合C,然后将集合C转换成字符串,对集合C切片,得到题目所求。下面先贴出分步代码,整体代码在文章最后。

step1、首先先求出[0,n]之间的所有素数集合A

n = int(input("输入要求的素数的范围值n:"))
sushu=[]
i=2
for i in range(2,n):
   j=2
   for j in range(2,i):
      if(i%j==0):
         break
   else:
      sushu.append(i)
# print(sushu)

step2、求出素数的所有排列组合B

from itertools import combinations
def combine(temp_list, n):
    '''根据n获得列表中的所有可能组合(n个元素为一组)'''
    temp_list2 = []
    for c in combinations(temp_list, n):
        temp_list2.append(c)
    return temp_list2
pailie_list = []
for i in range(2,len(sushu)):
    pailie_list.extend(combine(sushu, i))

step3、将B插入A中

for i in range(len(pailie_list)):
    b = sum(pailie_list[i])
    for j in range(len(sushu)-1):
        c_1 = sushu[j]
        if isinstance(c_1,int):
            c_1 = [c_1]
        c_11 = sum(list(c_1))
        c_2 = sushu[j+1]
        if isinstance(c_2,int):
            c_2 = [c_2]
        c_21 = sum(list(c_2))
        if c_11 < b <= c_21:
            s = list(pailie_list[i])
            sushu.insert(j+1,s)

step4、按照题目格式要求构建整体字符串

for i in range(len(sushu)):
    d_1 = sushu[i]
    if isinstance(d_1, int):
       d_1 = [d_1]
       sushu[i] = d_1
    sushu[i] = str(sushu[i])
#print(sushu)
str = ','
str_1 = str.join(sushu)
#print(str_1)

step5、输入l和r,求出题目所得

l = int(input("输入切片的起始值l:"))
r = int(input("输入切片的终止值r:"))
print(str_1[l-1:r-1])

最终整体代码

from itertools import combinations
def combine(temp_list, n):
    '''根据n获得列表中的所有可能组合(n个元素为一组)'''
    temp_list2 = []
    for c in combinations(temp_list, n):
        temp_list2.append(c)
    return temp_list2

# step1、先求出指定区间类的所有素数,已排好序
n = int(input("输入要求的素数的范围值n:"))
sushu=[]
i=2
for i in range(2,n):
   j=2
   for j in range(2,i):
      if(i%j==0):
         break
   else:
      sushu.append(i)
# print(sushu)

# step2、求排列组合
pailie_list = []
for i in range(2,len(sushu)):
    pailie_list.extend(combine(sushu, i))
# print(pailie_list)

# step3、将排列组合按集合元素和的大小排序插入到素数集合中
for i in range(len(pailie_list)):
    b = sum(pailie_list[i])
    for j in range(len(sushu)-1):
        c_1 = sushu[j]
        if isinstance(c_1,int):
            c_1 = [c_1]
        c_11 = sum(list(c_1))
        c_2 = sushu[j+1]
        if isinstance(c_2,int):
            c_2 = [c_2]
        c_21 = sum(list(c_2))
        if c_11 < b <= c_21:
            s = list(pailie_list[i])
            sushu.insert(j+1,s)

# step4、按照题目格式要求构建整体字符串
for i in range(len(sushu)):
    d_1 = sushu[i]
    if isinstance(d_1, int):
       d_1 = [d_1]
       sushu[i] = d_1
    sushu[i] = str(sushu[i])
#print(sushu)
str = ', '
str_1 = str.join(sushu)
#print(str_1)

l = int(input("输入切片的起始值l:"))
r = int(input("输入切片的终止值r:"))
print(str_1[l-1:r])

图为选取的部分示例
在这里插入图片描述
在这里插入图片描述
第一次写这种算法题的博客,记录下学习过程,思路和代码方面有不对和不成熟的地方,还请各为不吝指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值