素數判定 埃氏篩法與整數分解

2021-07-24 13:05:57 字數 1502 閱讀 3138

素數判定其實和數學裡的判定沒有過多的區別

只是要注意一定是i*i<=n 如果你用sqrt那玩意的話,可能會超時,具體是因為函式內部的實現和這個有點不同

這個大家應該都會,我這裡就不獻醜了

這裡先說用vector去記錄n的約數的方法(整數的分解)

#include 

#include

#include

#include

#include

using

namespace

std;

vector

divisor(int n)

}return res;

}int main()

printf("\n");

return

0;}

如果你要記每個約數出現的次數,可以這樣子

#include 

#include

#include

#include

#include

#include

using

namespace

std;

map prime_factor(int n)

}if(n!=1) res[n]=1;

return res;

}int main()

//cout0;}

這些在做題中不大常用 不過也很簡單相信在考場上都能想出來

接下來著重談一下埃氏篩法,它作用於求乙個區間裡的素數個數

這個演算法很巧妙,反正要我這種人去想肯定想不出來。。。。

是這樣的,對於1~n ,有1不是質數作為乙個額外的情況去處理,從2開始,你如果依次刪除2的倍數的話,發現最小的還剩下3,然後去刪3的倍數,你發現最小的剩下5………….最後你發現,每一次刪除的這個序列最開頭的數一定是質數,而刪除它以後最小的那個也一定是質數並且用於後續的刪除。。。。。。。

為什麼呢?因為你想啊,對於乙個被刪了數次後序列的首個數n,它一定不會被它以前的任何數整除,若有,它會被當做它的倍數刪掉。如果乙個數不被比它小的任何質數整除的話,它肯定是乙個質數拉。於是簡單地證明了埃氏篩法的合理性。

**也很簡單

#include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1000001;

bool isprime[maxn]=;

int res[maxn]=;

int cnt(int n)

for(int j=2*i;j<=n;j+=i)

}for(int i=1;i<=n;i++)

}return ans;

}int main()

這個演算法我個人認為很巧妙,在一些地方有實際的運用。

埃氏篩法 素數篩

埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...

素數 埃氏篩法

題目 求2 100以內的素數。素數 prime number 又稱質數,是指乙個大於1的自然數,除了1和它本身外,不能被整除以其他自然數。解法一 根據素數的定義,即用該數除比其小的數 1除外 都不能除盡,即為素數 public class prime if i n system.out.print ...

素數篩法(埃氏篩,線性篩)

時間複雜度o nloglogn void prime int b prime i 1則是合數 原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。但很明顯,這樣做會有重複。比如12 3 4 2 6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會...