在比賽或者工作時,有時候會經常要求我們程式設計求素數,但是我們自己寫出來的時間複雜度太高,所以我在這裡做個總結。
先貼上最終函式,該段**在開啟最大**優化時,可以直接內嵌進呼叫程式中,使得速度更加極致。
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,那麼...