上課!!定義:若乙個正整數無法被除了1和它自身之外的任何數整除,則稱該數為質數(或素數)。否則稱該數為合數。
我們需要明確,整個自然數集合中,質數的分布比較稀疏,對於乙個足夠大的整數\(n\),不超過它的質數大約有\(\frac\)個,換句話說,就是每\(ln n\)個數中大約有1個質數。
我們需要明確,計算機最優秀的地方在於機械地重複同一件事,針對質數的判定,正好是它的「強項」,我們只需要按照定義入手,列舉從2到n的所有數,如果能整除,就返回false,試到最後還不能的話就返回true。
模板:
bool prime(int n)
\)即可。
模板:bool prime(int n)
質數的篩選就是給定數\(n\),要求找出從1到\(n\)的所有質數。質數的篩選是信競中很重要的研究課題,也是一些基礎數學題的重要解題模型。
eratosthenes篩法即埃斯托拉特尼篩法,簡稱埃氏篩法。它基於這樣的思路:
任意整數的倍數都不是質數
基於這樣的想法,我們就從2開始從小到大列舉每個數\(x\),並把它小於\(n\)的倍數全部打上標記,當我們掃瞄到乙個數的時候,如果它還未被標記,它就是個質數。
這種篩法極好理解,但是效率較低,我們可以拿紙筆模擬,然後就能夠發現,有一些數是多個質數的倍數,這樣的話它就會被反覆篩好幾遍(比如說6),這樣雖然對正確答案不會造成影響,但卻影響程式執行的效率。所以我們對埃氏篩法進行優化:
對於每個數\(x\),我們從\(\)開始標記,把\(\),\((x+1)\cdot x\),\(\cdots\),\(\frac\cdot x\)打標記即可。
優化後模板:
void estorathenes(int n)
}
euler篩法即尤拉篩法,也叫快篩,線性篩法。是信競中最常用的質數篩法,以偉大的數學家尤拉的名字命名,建議大家熟練掌握。
上述的埃氏篩法即便在優化後也會重複標記,雖然已經少了很多重複,但還是不夠快速。比如,12既會被2標記也會被3標記,因為\(12=6\times 2=4\times 3\).為什麼會出現這種情況呢?因為我們在按照埃氏篩法篩選的時候,並沒有找出確定12的唯一方式,導致12的重複遍歷不可避免。
按照這個基礎,出現了快篩演算法,它的基本思想是這樣:我們在生成乙個需要被標記的合數的時候,每次只向現有的數中乘上這個合數的最小質因子,這樣一來,合數的質因子便被從小到大地累計起來,那剛才的12來說,它就被唯一分解成\(3\times 2\times 2\)。
這個演算法的時間複雜度是\(o(n)\)的。
歐氏篩法模板:
void euler(int x)
}}
這個定理hin重要!!!
整數的唯一分解定理:任何乙個大於1的整數都可表示為若干個質數的乘積,表示如下:
\[=^}\cdot^}\cdot \cdots \cdot^}
\]即:
\[=\prod_^^
\]所以我們通過如上定理分析出質因數分解在計算機上的實現:
先從2到\(\sqrt\)掃瞄所有整數\(x\),如果\(x\)能整除\(n\),那麼就在因子表上加上它,並用\(n\)一直除\(x\),每次除就在指數表c陣列中++,一直到除不盡為止。
**實現:
void divide(int n)
while(n%i==0)
n/=i,c[cnt]++;
}if(n>1)
prime[++cnt]=n,c[cnt]=1;
}
C new delete相關知識點詳解
每個程式在執行時都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區 free store 或堆 heap c語言用一堆標準庫函式malloc和free在自由儲存區中分配儲存空間,而c 則用new和delete表示式實現相同的功能。一 new和delete建立和釋放動...
約數相關知識點詳解
本篇隨筆講解資訊學奧林匹克競賽中數學部分的約數相關知識點。大體包括 整數唯一分解定理的推論,求 n 的正約數集合,篩選 1 n 每個數的正約數集合。需要讀者有不低於高中一年級的數學素養及一定的邏輯推理能力。本篇隨筆將不再對一些基本定理和數學知識 概念進行講解,有需要的同學請自行補習。通過質數相關知識...
知識點4 素數 質數
4.注意點 5.題型訓練 6.參考資料 素數又稱質數,是指除了1和本身之外,不能被其他數整除的一類數,反之,則稱為合數。注意 小於等於1的數既不是素數,也不是合數。本節將解決兩個問題 如何判斷給定的正整數n是否是質數 如何在較短的時間內得到1 n內的素數表。解法一 暴力。由素數的定義可以遍歷從2 n...