题目详情
解题思路
由于无限大集合区间不知道怎么取,所以先做有限区间[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])
图为选取的部分示例
第一次写这种算法题的博客,记录下学习过程,思路和代码方面有不对和不成熟的地方,还请各为不吝指教