篩選法求解素數問題C語言實現

2021-09-12 12:58:55 字數 1210 閱讀 2363

效率提公升的演算法基礎為:

1.乙個素數的任意整數倍必為非素數;

2.任何乙個合數n一定有乙個不超過sqrt(n)的素因子;

3.在第二輪非素數篩選時,因為是從所有奇數中按從小到大的順序篩選素數的,由歸納法不難得知:

若i = 3為素數,則因為在第一輪篩序中已經將2的倍數的數排除了,故可直接從j = 3 * 3開始進行非素數的篩選;

若i = 5為素數,則因為在前邊的篩選中已將2 * 5、3 * 5這兩種情況排除,故可直接從j = 5 * 5開始進行非素數的篩選;

依次類推。。。

故第二輪的迴圈變數j的初始值可置為i * i;

因為若乙個整數m為奇數,則m * m + m為乙個偶數,而偶數在第一輪篩選中已經被排除。故增量可設為2 * i。

附註:

由篩選函式screen_prime_number()可知該函式的時間複雜度(不包括素數的列印)為o(n * sqrt(n))。

/*---------------------------------

功能:求解區間[1, n]之內的所有素數

輸入示例:

100輸出示例:

2 3 5 7 11

13 17 19 23 29

31 37 41 43 47

53 59 61 67 71

73 79 83 89 97

author: zhang kaizhou

date: 2019-3-13 16:29:34

----------------------------------*/

#include #include #include #define maxsize 100000000 // 最大可求的(2, 100000000)之間的所有素數

int flag[maxsize]; // 標記陣列,用所存資料來標記與其下標對應的數字是否為素數

void screen_prime_number(int n);

int main()

void screen_prime_number(int n)else

}flag[2] = 1; // 2為素數

for(i = 3; i < sqrt(n); i += 2)}}

for(i = 2; i <= n; i++)}}

return;

}

素數對《篩選法求解》

time limit 1 sec memory limit 128 mb submit 619 solved 142 submit status web board 輸入乙個正整數n,求有幾對素數x,y,滿足n x y 3,2 和 2,3 視為相同的素數對 有多組資料,每行輸入乙個偶整數n 3輸出相...

01揹包問題(用c語言實現) 回溯法求解

回溯法求解01揹包 用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少應包含問題的乙個 最優 解。例如,對於有n種可選擇物品的0 1揹包問題,其解空間由長度為n的0 1向量組成。該解空間包含對變數的所有可能的0 1賦值。當n 3時,其解空間是 定義了問題的解空間後,還應將解空間很好的組織起來...

素數判斷 C語言實現

除了1和自身之外不能整除其它數,稱之為素數.最小的素數是2.沒有最大的素數.1000以內素數,如下圖所示 關於素數的演算法,一般有2種.第1種,給出乙個數n n 2 判斷n是不是素數 第2種,給出乙個數n n 2 把 2,n 的所有素數拿出來 判斷乙個數n是否是素數,最簡單粗暴的方法就是把n分別與i...