篩選法求素數(已更新,已完整)

2021-09-10 08:39:02 字數 789 閱讀 7986

基本原則:題目如果只需要判斷少量數字是否為素數,直接列舉因子2……n^(0.5) ,看看能否整除n。

如果需要判斷的次數較多,則先用下面介紹的辦法預處理。

#include#include#includeusing namespace std;

const int max=10000000;

bool primes[max]=;//假設全為質數

int prime[max]=;//假設在[0,n]的質數個數為0

void count_prime(int n)

}}

初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數(注意上面的 ixi , 比 ix2 要快點 ),把這些合數都篩掉。

但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。比如在i=2的時候,k=2x15篩了一次;在i=5,k=5x6 的時候又篩了一次。所以,也就有了快速線性篩法。

#include#include#include#include#includeusing namespace std;

const int max=10000000;

int prime[max]=,not_prime[max]=,num_prime=0;

//初始化儲存素數陣列大小為0,素數個數為0,1和0不是素數;

void count_prime(int n){

int i,j;

for(i=2;i快速線性篩法沒有冗餘,不會重複篩除乙個數,所以「幾乎」是線性的,雖然從**上分析,時間複雜度並不是o(n)。

篩選法求素數

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

篩選法求素數

篩選法求素數 質數 prime number 又稱素數。乙個 大於1的自然數 除了1和它本身外,不能被其他自然數 質數 整除,換句話說就是該數除了1和它本身以外不再有其他的因數 否則稱為合數 一 一般求素數的方法 乙個數n的因子不會超過n,但是如果我們知道數n的乙個因子a後,另乙個因子b b n a...

篩選法求素數

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