1. 程式人生 > >[演算法]用兩種求質數的演算法(窮舉法,篩選法),C語言實現

[演算法]用兩種求質數的演算法(窮舉法,篩選法),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 br>
for(j = 2 ; j < intsqrti jjsqrtibr>
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

num[i] = i;/*待篩選陣列賦值,這步簡單但是非常重要*/

}

for(i = 2 ; i < N ibr>
j = 2;

while(j * i < N br>
num[j * i] = 0;

j++;

}/*while*/

}/*for*/

for(i = 2 ; i < N i br>
if(num[ i ] != 0)

printf("%-10d" , num[ i ]);

}/*for*/

return 0;

}/*main*/




--------------------------------------------------------------------------------------
- 版權宣告:
- 如在本頁面內無特別說明,本文內容均為[李大仁部落格]原創,本文版權歸[李大仁部落格]所有。
- 歡迎轉載,轉載請務必在文章頁面明顯位置提供原文連結並註明出處。歡迎您在轉載本文時保留本段宣告。
- 文章標題:[演算法]兩種求質數的演算法(窮舉法,篩選法),C語言實現
- 獨立部落格:李大仁部落格
- 永久連結:http://www.lidaren.com/archives/244
--------------------------------------------------------------------------------------
以上內容由部落格自動釋出工具自動釋出,最終顯示內容和效果會與原文內容有所偏差,敬請諒解。