今天考試的題目是記不得了,等題目公開了再給大家分析,今天講點經典的算法,求質數,相信很多人還是記得當年的窮舉法了吧,就是不斷的讓每一個數除以一個小於他的數最大到 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