Python實現 求質數演算法

2021-08-21 14:46:33 字數 2670 閱讀 6906

質數也就是大於1的整數中,除了1和它本身以外不能被其他整數整除的數,也叫素數。

問題:現給定乙個任意整型引數 n(n>1),求出小於n 的質數的個數。這裡主要介紹五種演算法,前三種思路一致,主要是效率的差異;第五種採用了埃拉託斯特尼篩法進行計算。

例如: 輸入 10,輸出:4(2,3,5,7);    輸入:20, 輸出: 8(2,3,5,7,11,13,17,19);

第一種演算法:

針對小於n的每個正整數x,我們可以遍歷從2到x-1遍歷去試除,當出現乙個數能被整除,那這個數就不是質數;當然這種方法也是最容易想到的方法,但效率也是最低的方法;

**如下:

class calculator(object):

def prime(self, n):

m = 0

for i in range(2, n):

j = 2

for j in range(2, i-1):

if i % j == 0:

break

else:

m += 1

return m

第二種演算法:

我們可以遍歷從2到x/2的數去試除,這樣子相對於第一種方法節省了近一半的時間;

**如下:

class calculator(object):

def prime(self, n):

m = 0

for i in range(2, n):

j = 2

for j in range(2, int(i/2)+1):

if i % j == 0:

break

else:

m += 1

return m

第三種演算法:

我們可以針對第二種演算法進一步優化,遍歷從2到√x;

因為數學的因數都是成對出現的,如果出現乙個大於√x的因數,必然有乙個小於√x的因數存在,因此我們遍歷到√x就可以判定乙個數是不是質數;例如:16,   1*16, 2*8, 4*4;

**如下:

class calculator(object):

def prime(self, n):

m = 0

for i in range(2, n):

j = 2

for j in range(2, int(i**0.5)+1):

if i % j == 0:

break

else:

m += 1

return m

第四種演算法:

對於任意乙個大於3的合數(除了1和自身外,還能被其他整數整除的數),我們都可以將其拆分成至少包含乙個質數的因子相乘;例如:20=2*10(2是質數);45=5*9;利用此點,我們可以採用遍歷小於這個數的所有質數來確認這個數是不是質數。

**如下:

class calculator(object):

def prime(self, n):

if n <= 2:

return 0

else:

prime_list = list()

for x in range(3, n):

y = false

for y in prime_list:

if x % y == 0: # 對小於n的x進行遍歷,當某個數整除為0時,不執行新增列表操作

y = false

break

else:

y = true

if y is true:

return len(prime_list)

第五種演算法:

埃拉託斯特尼篩法;使用的原理是從2開始,將每個素數的各個倍數,標記成合數。乙個素數的各個倍數,是乙個差為此素數本身的等差數列。此為這個篩法和試除法不同的關鍵之處,後者是以素數來測試每個待測數能否被整除。(摘自維基百科)

具體的實現方式:

先留下第乙個素數2,將所有2的倍數的合數全部剔除;下乙個素數3,將3的倍數的所有合數全部剔除;接著用5進行篩選剔除;當所要使用的素數的平方大於設定值時,停止篩選,則剩下的所有數均為素數。

例如:求出小於120的所有素數,依次使用2,3,5,7進行篩選,當到11時,11*11>120,停止篩選,剩餘數即為質數。

class calculator(object):

def prime(self, n):

if n <= 2:

return 0

is_right = [true] * n

is_right[1] = false

for i in range(2, int(n ** 0.5) + 1):

if is_right[i]:

for j in range(i * i, n, i):

is_right[j] = false

m = 0

for x in range(2, n):

if is_right[x]:

m += 1

return m

python怎麼求質數 Python中質數怎麼找?

質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。python中怎麼查詢質數呢?1 首先我們建立乙個空的list 然後我們知道2是最小的質數,於是我們把2新增進這個空白的list 2 之後我們開始迴圈,第乙個數從3開始 用3除以小於3的質數,沒有小於它的質數能被它整除 我們將3再...

演算法之求質數

問題 統計所有小於非負整數 n 的質數的數量。一開始直接使用暴力列舉法 public static intcountprimes int n return count public static boolean isprimes int n return true 發現在leetcode上會超出時間...

簡化求質數演算法

前幾天做了個求質數題,這兩天瀏覽演算法題庫,偶然看到了原題以及程式分析 判斷素數的方法 用乙個數分別去除2到sqrt 這個數 如果能被整除,則為素數。這樣一來不用除到自身了都,顯然更簡單,同時還要對之前的方法進行點小修改,將記錄是否為質數的boolean變數都去掉,哈哈,是不是很激動的想知道答案?話...