《C演算法》讀書筆記 (3) 素數篩法

2021-07-04 15:13:43 字數 1198 閱讀 9161

原程式在處理邊界上有誤,做了一定修改:

void eratosthenesprime()

}}

該演算法的複雜度是f(

n)=n

/2+n

/3+n

/5+.

..n)

n(n)

為了檢驗演算法複雜度,引入了count計數值,並且與線性篩法做了對比

#include 

#include

#include

#include

#include

using

namespace

std;

#define n 100

#define cl(p, val) memset(p, val, sizeof(p))

int n, m;

bool b[n];

int prime[100000];

int prime_len;

int step;

void init()

prime_len = 0;

step = 0;

}void eratosthenesprime()

}printf("%d %d\n", prime_len, step);

}void cd_prime() // 線性演算法

}printf("%d %d\n", prime_len, step);

}int main()

線性篩法的優點是,每個待處理的自然數只被掃瞄到一次,幾乎可以收斂在o(

n)上。考慮到乘法所佔指令時間較長,在測試時將count值加在prime[j]*i之後。

以下是n=100,1000,10000,100000,1000000時的結果

ne篩法

線性篩法

100102

1391000

1409

1497

10000

16979

15466

100000

193076

157396

1000000

2122046

1591421

可以看到,隨著n規模的擴大,線性篩法逐漸體現出複雜度上的優勢;但原篩法f(

n)相當接近線性篩法的複雜度,也不失為一種良好的演算法。

演算法 素數篩法

素數篩法是acm 及各大比賽中必須熟練掌握的最低階的演算法,在已知某些素數的情況下對未判斷的數進行篩選,篩選掉必然不是素數的數。如何對數進行篩選,依據素數的性質,某個除1以外的正整數是素數,則該數的倍數一定不是素數 從1 10中篩選出所有素數 步驟當前元素12 3456 78910 原始陣列 000...

演算法之素數篩法

1 方法一 判斷是否是乙個素數 int isprime int a 計算列舉上界,為防止double值帶來的精度損失,所以採用根號值取整後再加1,即寧願多列舉乙個,也不願少列舉乙個數 2 方法二 判斷是否是乙個素數 mark 標記陣列 index 素數個數 int prime else return...

演算法 素數的篩法

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