埃拉托色尼算法
输入一个数,寻找这个数字以内的所有质数,并写入“e:\prime.txt”
注意:需要先在E盘,新建一个prime.txt,里面先写上2,3,5,7,作为种子质数(输入7后,要另起一行)
如图:
算法用的是开根号后,检查小于该数的质数是否能整除
优点:基本属于遍历,不存在欺骗数
缺点:复杂度极高,O(nlog(log(n))),所以速度很慢
def read():
f=open("e:\prime.txt","r")
buff=f.readlines()
f.close()
primearr=[]
for i in range(len(buff)):
s=buff[i]
buff[i]=s[0:-1]
if str(buff[i]).isdigit()==1:
primearr.append(buff[i])
return primearr
def write(num):
f=open("e:\prime.txt","a")
f.writelines(str(num)+"\n")
f.close()
def isprime(startnum,endnum,primearr):#主体算法#
snum=startnum
enum=endnum
arr=primearr
key=snum
while key<=enum:
sqrt_key=int(math.sqrt(key))#开根号后遍历prime.txt内的小于sqrt(key)的所有质数#
for j in range(1,len(primearr)):
if key%int(arr[j])==0:
break
if int(arr[j])>sqrt_key:
return key
key+=2
key=-1
return key
import math
primearr=read()
startnum=int(primearr[-1])
#lens=len(primearr)
s=str(input("在文件中显示多少以内的质数?(文件中已经存在小于等于"+primearr[-1]+"的质数)"))
while s.isdigit()==0:
s=str(input("输入错误,重新输入在文件中显示多少以内的质数?(文件中已经存在小于等于"+primearr[-1]+"的质数)"))
endnum=int(s)
if endnum<=startnum+1:
print("文件中寻找即可")
else:
if endnum%2==0:
endnum-=1
key=isprime(startnum+2,endnum,primearr)#从文本最后一个数+2开始,到输入数字为止#
while key<=endnum and key>=0:
print(str(key))
write(key)
arr=read()
key=isprime(key+2,endnum,arr)