此代码为我学习python时编写,特点是在前人的基础上作了充分优化。
1 ,搜索表充分缩短,速度极快。
2,可以中断运行,并可从中断处恢复运行。
3,程序按ss()运行。
>>>
ss()
4,运算时屏幕输出形式如下
>>>
ss()
(100000, ‘———-‘, 9592)
(200000, ‘———-‘, 8392)
(300000, ‘———-‘, 8013)
(400000, ‘———-‘, 7863)
。。。。。。
意思为每间隔100000中含有的素数个数,我编此程序是为寻找素数分布规律而作。
5,程序可无限运行,按ctrl-c可以中断运行
6,程序中断但不关闭运行窗口时,
>>>
list_num[-1]
1299989 打印输出现在计算出的最大素数, list_num[]中存有已经计算机的素数列表;
>>>
n
100021 打印输出现在计算到第几个素数了。
>>>
w() 保存素数列表到a.txt,保存运行变量到b.txt
此时可以关闭运行窗口了。
6,下次如想接着运行,可以先
>>>
r() 读取保存的变量到内存
>>>
ss() 然后接着运行。
7,运行的极限是你电脑上python列表支持的长度极限
8,保存和读取的时间,随你已计算出的素数个数而变化。
以下是源代码,可以直接拷贝运行
# -*- coding:utf-8 -*-
# 1, ss()求素数
# 2,ctrl-c 中断程序
# 3,w()保存素数列表到a.txt,运行变量到b.txt
# 4, r()读取保存的变量到内存
# 5, ss()再次运行求素数程序
# 6, list_num[-1]打印输出现在计算出的最大素数
# 7, n 现在已经计算出了多少个素数
import math
list_num=[2] #存放算出的质数
i=3 #待测数,不断递增
n=1 #质数的编号
tab=100000 #统计区间的大小
ii=1 #第几个统计区间
tem=0 #另时计数用
def ss():
global list_num #存放算出的质数
global i #待测数,不断递增
global n #质数的编号
global tab #统计区间的大小
global ii
global tem
while 1:
tem1=int(math.sqrt(i))+1
tem2=True
for num in list_num:
if num>tem1:break
if i % num == 0 :
tem2=False
break
if tem2==True: #得到一个质数
list_num.append(i)
n+=1
# print(n,"---",i)
if i==ii*tab:
print(ii*tab,"----------",n - tem)
ii+=1
tem = n
i+=1
def w():
###########写入质数列表
Li=[1,2,3,4,5,6]
pre=str(list_num)
pre=pre.replace("[","")
pre=pre.replace("]","")+"\n"
#print (pre)
f=open("a.txt","w")
f.write(pre)
f.close()
###############写入运行时参数
Li=[i,n,tab,ii,tem]
pre=str(Li)
pre=pre.replace("[","")
pre=pre.replace("]","")+"\n"
f=open("b.txt","w")
f.write(pre)
f.close()
def r():
global list_num #存放算出的质数
global i #待测数,不断递增
global n #质数的编号
global tab #统计区间的大小
global ii
global tem
###########读取质数列表
f=open("a.txt","r")
iii=f.readline()
iii=iii.replace("\n","")
Li=iii.split(",")
f.close()
#print (Li)
list_num=[]
for i in Li:
list_num.append(int(i))
###############读取运行时参数
f=open("b.txt","r")
iii=f.readline()
iii=iii.replace("\n","")
Li=iii.split(",")
f.close()
#print (Li)
i,n,tab,ii,tem = int(Li[0]),int(Li[1]),int(Li[2]),int(Li[3]),int(Li[4])
引用块内容