python判斷素數優化 求素數優化演算法

2021-10-11 09:41:55 字數 1748 閱讀 4983

在比賽或者工作時,有時候會經常要求我們程式設計求素數,但是我們自己寫出來的時間複雜度太高,所以我在這裡做個總結。

先貼上最終函式,該段**在開啟最大**優化時,可以直接內嵌進呼叫程式中,使得速度更加極致。

c語言// 對 n 進行素數判斷

inline static int is_prime(int n)

int i;

if (n == 2)

return 1;

if (n < 2 || n % 2 == 0)

return 0;

for (i = 3; i * i <= n; i += 2)

if (n % i == 0)

return 0;

return 1;

python

python 的話,由於本身是指令碼語言,所以很難做到很快,一般都是用c語言進行計算的。

# 對 n 進行素數判斷

# 注意:請不要傳入浮點數

def is_prime(n):

if (n == 2):

return true

if (n < 2 or n % 2 == 0):

return false

i = 3

while( i * i <= n):

if( n % i == 0):

return false

i += 2

return true

原理根據定義

根據概念判斷:如果乙個正整數只有兩個因子, 1 和 p,則稱 p 為素數。所以根據定義我們寫出如下函式:

int is_prime(int n)

int i;

if (n < 2)

return 0;

for (i = 2; i < n; i++)

if (n % i == 0)

return 0;

return 1;

時間複雜度為o(n),可以說是很差的演算法。

上面的函式做了很多不必要的動作,比如偶數的判斷,因為除了2本身以外,其他的大於0的偶數都有因子2。

偶數優化

這面這段**,去掉了偶數的判斷。

int is_prime(int n)

int i;

if (n < 2)

return 0;

if (n == 2)

return 1;

for (i = 3; i < n; i += 2)

if (n % i == 0)

return 0;

return 1;

時間複雜度o(n/2), 速度提高一倍,比之前的效能更優化了一點。

根據定理進行優化

定理: 如果 n 不是素數, 則 n 有滿足 1

int is_prime(int n)

int i;

if (n == 2)

return 1;

if (n < 2 || n % 2 == 0)

return 0;

for (i = 3; i * i <= n; i += 2)

if (n % i == 0)

return 0;

return 1;

時間複雜度o(sqrt(n)/2), 速度極大的提高了。

後言其實還可以將已經計算出來的素數陣列帶到演算法中去的,這樣的演算法速度會更快,但是其由於其不符合高內聚、低耦合的程式設計思想,這裡就不提了。這樣的演算法可以用於特定程式來做優化,但是不適合普遍程式。

總結演算法的優化是數量級別的。

求素數,判斷素數,篩法

1.判斷素數 時間複雜度 o sqrt n 空間複雜度 o 1 include include sqrt函式標頭檔案 using namespace std bool prime int n return 0 不足之處 很多數被處理了不止1遍,比如6,在素數為2的時候處理1次,為3時候又標記一次,因...

C語言判斷素數(求素數)

素數又稱質數。所謂素數是指除了 1 和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被 2 16 的任一整數整除。思路1 因此判斷乙個整數m是否是素數,只需把 m 被 2 m 1 之間的每乙個整數去除,如果都不能被整除,那麼 m 就是乙個素數。思路2 判斷方法還可以簡化。m 不必被...

求素數的優化

學習自 傳送門 1.乙個乙個找,找因子直到i 2.找因子直到i 2 比如 判斷i是否為素數,則看i是否能整除j 2 i 2 3.找因子直到根號i 比如 判斷i是否為素數,則看i是否能整除j 2 根號i 因為對於16,根號16 4,那麼判斷8是16因子就沒必要了,因為2 8 16,如果已經找到8,那麼...