求素數最優程式碼(python)
阿新 • • 發佈:2019-01-05
此程式碼為我學習python時編寫,特點是在前人的基礎上作了充分優化。
1 ,搜尋表充分縮短,速度極快。
2,可以中斷執行,並可從中斷處恢復執行。
3,程式按ss()執行。
>>>
ss()
4,運算時螢幕輸出形式如下
>>>
ss()
(100000, ‘———-‘, 9592)
(200000, ‘———-‘, 8392)
(300000, ‘———-‘, 8013)
(400000, ‘———-‘, 7863)
。。。。。。
意思為每間隔100000中含有的素數個數,我編此程式是為尋找素數分佈規律而作。
5,程式可無限執行,按ctrl-c可以中斷執行
6,程式中斷但不關閉執行視窗時,
>>>
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])
引用塊內容