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