如何用Python编写一个素数环?

Python011

如何用Python编写一个素数环?,第1张

代码: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()