2020 04 16 素數例項之研究路 四

2021-10-05 03:43:12 字數 2168 閱讀 1611

例1、判斷1-100之間的所有素數(素數又叫質數,只有1和它本身狂歌因數)

因為1既不是``素數又不是合數,所以從2開始判斷

list=

for i in range(2,101):

for j in range(2,i-1)

if i%j==0:

print('%d是素數'%(i))

#else 這裡不需要寫else,因為不滿足if條件後自動返回迴圈遍歷iprint(list)

檢查總結

上述**錯誤:

①執行結果錯誤-能被1和自身整除的數不是素數,所以if條件成立後新增至list錯誤;

②數字重複-每有乙個整除因數就新增一次,錯誤至重複;

③j遍歷範圍不對-找因數排出1和i自身即可,又range()包前不包後,所以i-1錯誤;

④2已知的素數,漏掉

改正**為:

list= #for i in range(2,101):

j=2 #因為range範圍原因,j=2遍歷不到,所以這裡直接賦值給出

for j in range(2,i):

if i%j==0:

print('%d不是素數'%(i))

break

else:

print('%d是素數'%(i))

print(list)

注意上述**還是錯誤的:

else與if 同等時,對於乙個i,取乙個因數判斷不符條件後,後續還會繼續遍歷j進行判斷,因此錯誤;

正確因該是:只要有乙個因數j使if條件成立,即可排出素數可能,跳出第二個if迴圈,但是若是遍歷完所有j都不能使if條件成立,則才能得出i是素數的結論,故else縮排與j的for迴圈同等;

最終版改寫**:

list=

for i in range(2,101):

j=2 #因為range範圍原因,j=2遍歷不到,所以這裡直接賦值給出

for j in range(2,i):

if i%j==0:

print('%d不是素數'%(i))

break

else:

print('%d是素數'%(i))

print(list)

方法二: 使用多執行緒實現

from threading import thread,lock

#import threading

lock=lock() #建立鎖

list1=

for i in range(2,101):

def prime_number():

global list1

while true: #這裡的主要目的是迴圈遍歷,可以改寫為 while list1!=0

#為防止資料錯誤,多執行緒時加鎖

lock.acquire()

num=list1[0]

lock.release()

flag=0

for j in range(2,num):

if num%j==0:

flag=1

break

#這裡不寫else,因為不需要不滿足的情況

if flag==0:

print(num,'是素數')

else:

print(num,'不是素數')

list_threading=

for i in range(5):

t=thread(target=prime_number)

for i in list_threading:

i.start()

for i in list_threading:

i.join()

print('我是主程序')

關於素數的研究

首先需要講的是這篇文章,太精闢了 1.最簡單的求素數 bool isprime int primes,int n 2.得到乙個素數表 構造素數序列primes void makeprimes int primes,int num if flag primes cnt i 如上是得到乙個純素數表,而使...

Jmesa 例項研究

新專案要用到這個元件,用了一天多的時間簡單學習了一下,感覺jmesa在處理設計 風格上還是很強大的,不足的是標籤不是很完善,貌似不能用標籤來設計匯出功能。jmesa官網 http code.google.com p jmesa 三.環境搭建 無論寫什麼程式,環境是很重要的。將jmesa 3.0 li...

素數定理相關的研究

a 小於等於n 當a等於0時,上式就是高斯提出的素數定理,當a等於n時上式顯然成立。a越大,上式求出的結果越精確,但是a越大 a到n素數個數約為 上式求解很複雜,黎曼素數計數公式推導過程有介紹上式的求解,太過專業,一般人看不懂吧。我們利用尤拉乘積公式處理,上式約等於 再利用積分處理,上式約等於 上式...