最簡單寫法:
int
isprime
(int n)
for(
int i =
2; i < n; i++)}
return1;
}
初步優化:乙個數的因數是成對出現的,其中乙個因數在開方後的前面乙個在開方後的後面,所以只需判斷它前面的數就可以了,如果前面都沒有,那麼它後面更不會有.這樣就可以減少迴圈次數.
int
isprime
(int n)
for(
int i =
2; i <=
sqrt
(n); i++)}
return1;
}
素數篩:素數定義:質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。
合數定義:合數是指在大於1的整數中除了能被1和本身整除外,還能被其他數(0除外)整除的數。與之相對的是質數,而1既不屬於質數也不屬於合數。最小的合數是4。
思路:從質數2開始把質數對每個數的乘積,也就是合數篩掉,剩下的自然就是質數了
int prime[
10000]=
;//用來判斷素數,0為素數,1為合數,下標0對應的元素用作計數器,表示素數的個數
int isprime[
10000];
//用來儲存素數
void
prime_sieve()
}}
線性篩:在素數篩中,會篩到重複的合數,為了提高效率,出現線性篩。
思路:每個合數都可以被他的最小質因數篩掉
int prime[
10000]=
;//用來判斷素數,0為素數,1為合數,下標0對應的元素用作計數器,表示素數的個數
int isprime[
10000];
//用來儲存素數
void
init()
for(
int j =
1; j <= prime[0]
; j++)}
}
最後一行**的細節說明:
首先:能被質數所整除的數一定是合數
既然這個合數能被這個質數整除,說明這個合數可以拆解為這個質數與某個數相乘的形式。
如果這個合數與當前質數的下乙個質數相乘所得到新合數一定能被更小的質數所篩掉
如下:新合數 = (某數 * 當前指數)*當前質數的下個質數(下個質數更大)
求素數,判斷素數,篩法
1.判斷素數 時間複雜度 o sqrt n 空間複雜度 o 1 include include sqrt函式標頭檔案 using namespace std bool prime int n return 0 不足之處 很多數被處理了不止1遍,比如6,在素數為2的時候處理1次,為3時候又標記一次,因...
素數判斷及篩法
單個素數判斷 素數判斷 小資料 int prime int n miller rabin 大素數判定 單個數字n複雜度15 log n int mr 30 此陣列為測試用的a,這12個可測所有的long long int lli miller rabin lli n if x 1 return fa...
素數判斷及篩法
素數 prime number 又稱質數,有無限個。素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。問法1 給定乙個數n,判斷n是不是素數 一 暴力列舉 列舉2 n 1分別當做除數,判斷是否能整除,如果某個數能把n整除,那麼就說明n不是素數,如果所有都不能整除,那麼n就是素數。注 n...