簡單素數篩

2022-05-19 19:48:10 字數 1320 閱讀 6650

今天,我看了一些數學知識,而數論是比較主要的,而素數篩是其中重要的乙個,現在來介紹一下簡單素數篩

首先來,普及一下素數的概念

若乙個正整數無法被除了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 ...