篩選法求素數

2021-06-23 03:15:49 字數 1687 閱讀 2274

篩選法求素數

質數(prime number)又稱素數。乙個

大於1的自然數

,除了1和它本身外,不能被其他自然數(質數)

整除,換句話說就是該數除了1和它本身以外不再有其他的因數

;否則稱為合數

一、一般求素數的方法:乙個數n的因子不會超過n,但是如果我們知道數n的乙個因子a後,另乙個因子b(b=n/a)也就知道了,因此列舉乙個數n的因子時只需列舉2到sqrt(n)即可。

**如下:c/c++**

#include #include #include using namespace std;

typedef long long ll;

//是素數返回true

bool isprime(ll n)

/*bool isprime(ll n)

return true;

}}*/

int main()

return 0;

}

這種方法只適用於n較小時,當n比較大時,太費時。

二、篩選法求素數:

篩選素數的方法不是直接判斷乙個數是不是素數,而是將不是素數的數全部去除,剩餘的數自然就是素數了。

一般步驟如下:

1.如果區間包含1,首先將1標記為非素數。

2.從下乙個最小的素數a開始,將該素數的倍數(2a,3a,……,ka)全部標記為非素數。

3.從a的後面找下乙個最小的素數,重複2操作。

4.重複2,3操作,直到所有元素都篩選完為止。

例如:篩選1到25之間的素數

①按部就班地按上面的4步做,

第一步,將1標記為非素數;

第二步,找下乙個素數a=2,標記2的倍數4,6,8,……,22,24;

第三步,重複第二步,這時a=3,標記3的倍數6,9,……,21,24;

第四步,重複第二步第三步,a=5,a=7,a=11,a=13,a=17,a=19,a=23

步驟如下圖所示:

相應的**如下:c/c++**

程式一:

#include #include #include using namespace std;

typedef long long ll;

#define max 8099999

//用1標記非素數

bool prime[max];

//p陣列儲存素數,總數tot

int p[max],tot;

void getprime(int n)

}int main()

}int main()

}

在篩選法求素數時,採用的是標記非素數,而標記非素數的方法是用該數的因子通過乘乙個數得到該數,換句話說就是列舉了要判斷的每乙個數的所有因子,準確的說應該是每乙個數的質因子,那麼如果對程式做一些微小變化就可以在篩素數的同時求出[1,n]區間內每乙個數的質因數個數。

篩選法求素數

題目 求100以內的所有素數。求素數的演算法常考,篩選法求素數不常見。定義長度為101的int陣列a 101 初始化為1。依次測試1到100的所有數字是否為素數。若i為合數,則a i 0。篩選完畢後,所有非0元素a i 所對應的數字i為素數。include using namespace std i...

篩選法求素數

一 素數的定義 對於素數的定義,維基百科上給出如下一段話 素數指在大於1的自然數中,除了1和此整數自身外,無法被其他自然數整除的數。比1大但不是素數的數稱為合數。二 利用電腦程式,很容易就可以得到不太大的素數。以c語言為工具來描述常見的判斷素數的函式 int isprime int n 這個函式並不...

篩選法求素數

篩選法求素數。線性時間複雜度。將合數都標記,剩下的就是素數。出現乙個數,則把已這個數為因子的數都標記為合數。如2,所以4,6,8 10.都標記為合數 如3,所以9,12,15.都標記為合數 如4,所以16,20,24.都標記為合數 即,若i是素數,則從 j i i 開始,把 j i j 2i j 3...