素数判定模板
一、素數(shù)與合數(shù)
素數(shù)和合數(shù) 如果一個整數(shù)p只有1和p兩個因子,則p為素數(shù),亦稱為質(zhì)數(shù) 不為素數(shù)的其它數(shù)為合數(shù)。如果n為合數(shù),則n必有一個小于或等于n的平方根的數(shù)因子。
二、素數(shù)的判別方法
1、試除法
int isprime(int x) {int i,k;k=(int)sqrt(x);for(i=2;i<=k;i++){if(x%i==0)return 0;}return 1; }或:
int isprime(int x) {int i;for(i=2;i*i<=x;i++){if(x%i==0)return 0;}return 1; }2、高效判別法
素數(shù)出現(xiàn)的規(guī)律:
當(dāng)n≧5時,如果n為素數(shù),那么n mod 6 = 1 或 n mod 6 = 5,即:n一定出現(xiàn)在6x(x≥1)兩側(cè)。
當(dāng)x≥1時,有如下表示方法: ……, 6x, 6x+1, 6x+2, 6x+3, 6x+4, 6x+5, 6(x+1), 6(x+1)+1,…… 不在6x兩側(cè)的數(shù)為6x+2, 6x+3, 6x+4,即2(3x+1), 3(2x+1), 2(3x+2),它們一定不是素數(shù),所以素數(shù)一定出現(xiàn)在6x的兩側(cè)。
int isprime(int x) {int i,k;k=(int)sqrt(x);if(x<2)return 0;if(x==2 || x==3)return 1;if(x%6!=1 && x%6!=5)return 0;for(i=5;i<=k;i+=6)if(x%i==0 || x%(i+2)==0)return 0;return 1; }3、埃氏篩選法
埃拉托斯特尼篩選法:開始假設(shè)所有范圍內(nèi)的數(shù)都是素數(shù),然后將所有這些素數(shù)的倍數(shù)(肯定不是素數(shù))篩掉,經(jīng)過數(shù)輪篩選,剩下來的就是素數(shù)。
20以內(nèi)素數(shù)的埃氏篩選如下:
?幸免于難的數(shù)就是素數(shù),有:2 3 5 7 11 13 17 19。
#define MAX 1000010 int table[MAX]={1,1}; void isprime(int x) {int i,j; for(i=2;i<MAX;i++){if(table[i]==0)for(j=i+i; j<MAX; j+=i)table[j]=1;} }?4、歐拉篩選法
歐拉篩法的基本思想 :在埃氏篩法的基礎(chǔ)上,讓每個合數(shù)只被它的最小質(zhì)因子篩選一次,以達(dá)到不重復(fù)的目的。即:把 prime 里面記錄的素數(shù),升序來當(dāng)做要消去合數(shù)的最小素因子。
#define MAXN 100000010 int pri[MAXN]; //存放素數(shù)的數(shù)組 int visit[MAXN]; //訪問數(shù)組,將素數(shù)x的倍數(shù)做標(biāo)記 void getPrime() {int i,j;for(i=2;i<=MAXN;i++){if (!visit[i])pri[++pri[0]] = i; //記錄素數(shù),pri[0]用于計數(shù)for(j=1; j<=pri[0] && i*pri[j]<=MAXN; j++){visit[i*pri[j]] = 1;if(i%pri[j] == 0)break;}} }總結(jié)
- 上一篇: 信息学奥赛一本通 1118:铺地毯 |
- 下一篇: 信息学奥赛一本通(1408:素数回文数的