演算法 素數的篩法

2022-07-19 01:09:15 字數 1284 閱讀 2697

本文實現了素數的篩法演算法。

在寫**的過程中,時不時會遇到求解素數的任務,特意將素數求解方法總結成文章以備不時之需。素數的求解演算法大概有兩種。一種是列舉某一範圍的數,然後逐個判斷該數是否為素數。這種方法簡單但效率不高。另一種方法是使用素數的篩法將某一範圍內的所有素數篩選出來,然後再打表。篩法的原理很簡單:從最小的素數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...