banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[算法]用兩種求質數的算法(穷舉法,篩選法),C語言實現

今天考試的題目是記不得了,等題目公開了再給大家分析,今天講點經典的算法,求質數,相信很多人還是記得當年的窮舉法了吧,就是不斷的讓每一個數除以一個小於他的數最大到 sqrt (N),然後得出結果,算法時間複雜度 O (N^2),優化過的算法 O (N * sqrt (N)),經典的算法我就不講了,初學者如果不懂的話,可以留言,或者跟我聯繫

代碼如下:

/* 求質數的經典方法,窮舉法
*author CG
*2008 12 21
* 時間複雜度 O (N*sqrt (N))
*/
#include"stdio.h"
#include"math.h"

#define N 200/* 定義測試數據 */
int main() {
int i , j;
for(i = 2 ; i < = N ; i++) {
for (j = 2 ; j <= (int) sqrt (i) ; j++){/* 比較直到 j 到 sqrt (i)*/
if(i % j == 0){
break;
}/*if*/
}/*for*/

if (j> (int) sqrt (i)){/* 符合條件?*/
printf ("%-10d",i);/* 輸出 */
}/*if*/
}/*for*/
return 0;
}/*main*/

下面是目前使用得比較多的求質數的方法,當然更加優越的算法利用《費馬小定理》
可以得出質數的概率分布實現接近線性的算法複雜度的,今天不講,有興趣?那繼
續關注我吧,要是最近有時間的話,我會把代碼放上來。

好了,今天的主角:篩選法求質數 ,原理就是從已經存在的數組數據中篩選要的質
數,需要一個 N 大小的空間,N 為所求質數的範圍,相比經典算法比較浪費,不過效
率較高,O (N*LogN),適合大範圍求質數,但是空間浪費也是客觀的,

原理:從索引 j=2,0,1, 的情況排除了,開始篩除 j 的所有倍數,然後再篩 j+1,直到
篩選到 j=N, 篩除完畢

具體算法如下:

/* 篩選法求質數
*author CG
*2008 12 21
* 算法複雜度 O (N*LogN)
*/
#include "stdio.h"
#define N 200/* 定義最大數 */

int main() {
double s , t;
int num[ N + 1 ] = {0};
int j = 2 ;/* 定義起始數,從 2 開始 */
int i ;/* 計數器 */
for(i=2 ; i

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。