今天,我看了一些數學知識,而數論是比較主要的,而素數篩是其中重要的乙個,現在來介紹一下簡單素數篩
首先來,普及一下素數的概念
若乙個正整數無法被除了1和它本身之外的任何自然數整除,則稱該數為素數,也稱質數(或素數),否則稱該正整數為合數。通過介紹質數(下文統稱質數)的概念,我們知道了一種判斷質數的方法
通過列舉:這種方法的速度太慢了,因此我們需要更快的方法
ps:即使從1列舉到根號n也是很慢的
所以我們要引進一種好方法
就是大於二的所有數的倍數都是合數,那就好辦了,我們可以從2開始(先初始化乙個v陣列的所有元素為零)2的倍數都是合數,標記v[i*j]為一,3的倍數都是合數,標記為1……
以此類推,我們就可以得出答案了
下面有一道例題
給定乙個範圍n,你需要處理m個某數字是否為質數的詢問(每個數字均在範圍1-n內)
第一行包含兩個正整數n、m,分別表示查詢的範圍和查詢的個數。
接下來m行每行包含乙個不小於1且不大於n的整數,即詢問該數是否為質數。
輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。
輸入 #1
100 523
49197
輸出 #1
yes
yesno
noyes
時空限制:500ms 128m
資料規模:
對於100%的資料:n<=10000,m<=10000
樣例說明:
n=100,說明接下來的詢問數均不大於100且不小於1。
所以2、3、97為質數,4、91非質數。
故依次輸出yes、yes、no、no、yes。
這道題就是一道標準的篩素數的題,因為它要訪問多個數啊,不做素數篩不可以啊,所以經過努力,我寫出了**
#include #include using namespace std;
int v[10000005];//記錄用
int n,m;
int p;
void primes(int n)//簡單素數篩函式
}int main()
{ cin>>n>>m;
primes(n);//呼叫函式
for(int i=1;i<=m;i++)
{ cin>>p;
if(v[p])
cout<<"no"《這就是簡單素數篩,你get到了嗎?
下集預告:高階素數篩(或其他的)
素數篩法(素數篩 線性篩)
求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...
素數判定,素數篩
這些零碎的知識點每個都學過n次了,但隔一段時間就會忘,記錄下來 素數定義 只能被自身和1整除的大於1的正整數 通過這個定義,我們就可以得出判斷素數的 這裡用到了cmath中的sqrt函式,其原型為double sqrt double 所以在取上界的時候,為了避免double帶來的精度丟失,寧可多列舉...
素數與素數篩
素數篩法 線性篩法 啊,耳熟能詳。素數又稱質數,乙個大於1 11的自然數,除了1 11和它本身外,不能被其他自然數整除,換句話說就是該數除了1 11和它本身以外不再有其他的因數 否則稱為合數。啊!1 11不是素數啊 啊,也耳熟能詳了,暴力列舉一下除1 11和本身的自然數是否會被整除。bool is ...