python编程判断素数只需用,2到n2的数去除n的编程?

Python065

python编程判断素数只需用,2到n2的数去除n的编程?,第1张

不是2到n/2,是2到n**0.5,就是2到n的开方。

我这里只是一个判断的片段。

0.5是开方,结果是浮点数,需要int转为整数,range是左闭右开,所以+1,else是表示for循环没有触发break,完整循环完后执行的分支,也就是没有找到因数,所以是素数。n是大于等于2的自然数。

代码: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)并列。

这样写不知道你能不能理解?

这是等效代码:

L1 = []

for x in range(1, 100):

list = []

for y in range(2, x/2 + 1):

if x % y == 0:

list.append(y)

if not list:

L1.append(x)

print L1

对于空列表,not [] 返回True

原来的代码中, if not后面是一个临时生成的列表, 如果这个列表为空则表明x没有任何>=2的因子,x必是素数,于是添加x 到主列表.

[x for x in range(1, 100) if express ]

这样的语句仅仅在express是True才会添加x