素數判定其實和數學裡的判定沒有過多的區別
只是要注意一定是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這個素數進行倍數標記時同樣會...