1. 程式人生 > >求素數最優程式碼(python)

求素數最優程式碼(python)

此程式碼為我學習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])

引用塊內容