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