日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

素数判定模板

發布時間:2025/3/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 素数判定模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、素數與合數

素數和合數 如果一個整數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;}} }

總結

以上是生活随笔為你收集整理的素数判定模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。