本文實現了素數的篩法演算法。
在寫**的過程中,時不時會遇到求解素數的任務,特意將素數求解方法總結成文章以備不時之需。素數的求解演算法大概有兩種。一種是列舉某一範圍的數,然後逐個判斷該數是否為素數。這種方法簡單但效率不高。另一種方法是使用素數的篩法將某一範圍內的所有素數篩選出來,然後再打表。篩法的原理很簡單:從最小的素數2開始,依次將2的倍數給剔除,然後將後面沒有被剔除的最小素數3的倍數依次剔除......重複上述操作就可以將範圍內的所有合數給剔除掉,剩下的自然就是素數。該演算法可以使用c語言實現,如下面的**所示。
1 #include 23/*使用0和-1是為了使用記憶體填充函式memset */4
#define false (-1)
5#define true 0
6#define max_range_n 10000
78 unsigned int counter = 0;9
static
char
indexs[max_range_n];
10static
intprimes[max_range_n];
1112
void screenprimes(char *indexs, int *primes, unsigned int *counter)
13
值得注意的是在memset函式中,sizeof(indexs[0])返回乙個unsigned int值,如果max_range_n很大的話,其和max_range_n相乘會有溢位的危險。
有了上述的實現,要求列印前50個素數可以用下述**實現。
1 #include 2 #include 34/*使用0和-1是為了使用記憶體填充函式memset */5
#define false (-1)
6#define true 0
7#define max_range_n 10000
89 unsigned int counter = 0;10
static
char
indexs[max_range_n];
11static
intprimes[max_range_n];
1213
void screenprimes(char *indexs, int *primes, unsigned int *counter)
1434
35int
main()
36
演算法 素數篩法
素數篩法是acm 及各大比賽中必須熟練掌握的最低階的演算法,在已知某些素數的情況下對未判斷的數進行篩選,篩選掉必然不是素數的數。如何對數進行篩選,依據素數的性質,某個除1以外的正整數是素數,則該數的倍數一定不是素數 從1 10中篩選出所有素數 步驟當前元素12 3456 78910 原始陣列 000...
素數篩法(素數篩 線性篩)
求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...
演算法之素數篩法
1 方法一 判斷是否是乙個素數 int isprime int a 計算列舉上界,為防止double值帶來的精度損失,所以採用根號值取整後再加1,即寧願多列舉乙個,也不願少列舉乙個數 2 方法二 判斷是否是乙個素數 mark 標記陣列 index 素數個數 int prime else return...