代码:n = int(input("请输入最大数n:"))lists = [[1]]#多个
素数环surplusnum = list(range(1,n+1)) #剩余的数def sumisprime(x, y):#x与y之和是否是素数isprime=True#是否是素数s = x + y#和for i in range(2, int(s**0.5)+1):#素数判定法:从2开始直到此数的开方内的整数都不能被该数整除,则此数为素数if s%i == 0:#能被整除isprime = False#不是素数break#跳出循环return isprime#返回后否是素数(是:True,否:False)changelast=lambda listx,addvalue:listx[0:-1]+[addvalue]#改变
列表末尾的函数while len(lists[0] if len(lists) else [0]*n) <n:#当素数环长度小于最大数时n2 = len(lists[0]) #n2为判定,理论当前列表长度最大值for listn in lists:#
遍历各个可能的素数环surplusnum=list(range(1,n+1))#默认值for j in listn:#遍历当前列表的数surplusnum.remove(j)#剩余的数中删除此数for i in surplusnum:#遍历剩余的数if sumisprime(listn[n2-1], i):#最后一个数与它的和是素数if len(listn) == n2:#如果现在这个列表是没有被添加过的listn.append(i)#增加在这个列表else:#如果该列表已经被添加过lista = changelast(listn, i)#要加入的列表if lista not in lists:#如果不在这个列表里lists.append(lista)#添加到另一个列表for listn in lists.copy():#防止lists被删造成影响if len(listn) != n2+1:#如果长度没有达到预期(+1)lists.remove(listn)#删除该列表(取消此可能性)if len(lists[0]) == n:#已经符合条件for listn in lists:#遍历列表,检查首尾if sumisprime(listn[-1], listn[0]):#如果首尾相加等于素数print(listn)#环成立,打印出来break#结束循环说明:经试验,都没什么问题,n=12也能很快运算完(但我劝你不要打出来),如果你只需要1个素数环,可以把break的缩进调到print(listn)并列。
放到方括号中是列表解析,会把所以结果生成一个列表,举例:
a=[x*x for x in [1,2,3]]
print(a)
[1,4,9] #a是一个列表
放到圆括号中会产生一个生成器,不会直接显示结果,举例:
a=(x*x for x in [1,2,3])
print(a)
<generator object <genexpr> at ......> #a是一个生成器
next(a) #输出1
next(a) #输出4
next(a) #输出9
next(a) #出错,生成器停止了
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
# 创建一个图形对象
fig = plt.figure()
# 循环绘制一百个同心圆
for i in range(100):
# 使用 Circle 类创建圆形,并指定半径和圆心坐标
circle = Circle(xy=(0, 0), radius=i+1)
# 使用 fig.add_subplot() 方法将圆形添加到图中
ax = fig.add_subplot(1, 1, 1)
ax.add_patch(circle)
# 调用 plt.show() 方法显示图形
plt.show()