先看這道題
洛谷p1217回文質數
對於這道題,普通的暴力模擬會tle,所以得尋求改進。這裡我學會了兩種方法;
第一種:線性篩法
這種演算法的核心思想就是:任何乙個合數都可以由質數相乘得到
下面就是核心**,吃透了核心**就可以在其中新增點細節,然後就可以拿去解決問題了
//這裡需要開多大的陣列取決自己
bool isprime[
10000];
int prime[
10000];
int b;
//上限
for(
int i=
1;i<=b;i++
)for
(int i=
2;i<=b;i++
)//篩掉非質數
for(
int j=
1;j<=s;j++
)//遍歷prime陣列
}
第二種:埃氏篩法
其核心思想就是:將質數的倍數篩掉。比如對於質數2,2的倍數4、6、8等一定不是質數數;對於質數3後,3的倍數6、9、12等一定不是質數。
其核心**:
bool isprime[
10000];
int prime[
10000];
int b;
//上限
int s=0;
for(
int i=
1;i<=b;i++
)for
(int i=
2;i<=b;i++)}
}
總結:兩種方法各有各的好,使用哪種方法更好具體看題目本身。 素數篩法(埃氏篩,線性篩)
時間複雜度o nloglogn void prime int b prime i 1則是合數 原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。但很明顯,這樣做會有重複。比如12 3 4 2 6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會...
埃氏篩法和線性篩法求素數
演算法中有一類題,題目中涉及到大量素數的判定,只要範圍確定,素數的個數和素數就已經是固定不變的,那麼我們可以考慮先預處理,把範圍內所有素數篩選出來,那麼篩素數的方法有哪些,下面就兩種演算法的思想和標程進行說明。一 埃氏 eratosthenes 篩素數。原理 基於任意整數x的倍數2x,3x,4x,都...
埃氏篩法 素數篩
埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...