節約空間的篩素數方法***
求不超過n的所有素數,比較好的演算法是埃拉託斯特尼篩法:給出要篩數值的範圍n,找出\sqrt以內的素數p_,p_,\dots,p_。先用2去篩,即把2留下,把2的倍數剔除掉;再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去......。
這個演算法非常快,但缺點是消耗記憶體,理論上n範圍內的所有數都要儲存在記憶體中。這個可以進行乙個優化:每個數只要分配一位就可以了,畢竟我們只需知道這個數是否是素數。這裡還可以進一步優化:我們只需儲存所有奇數就行了(除2外的偶數都不是素數),因此,我們可以使用n/16的記憶體實現這個演算法:
inline bool getbit(char* arr, size_t pos)
inline void setbit(char* arr, size_t pos)
void printprimes(size_t n)
} printf("\ntotal number: %lu\n", total);
delete arr;
}
篩素數的方法
思路 將當前數i的所有倍數 一定是合數 篩掉。如 當i 2時,將4,6,8,10.篩掉,當i 3時將6,9,12.篩掉。很明顯這種篩法有很多元素被重複篩了,如篩6時,i 2時篩了一遍,i 3時又篩了一遍。int prime n cnt bool st n void isprime int n 該種方...
篩法素數打表方法
埃拉託斯特尼篩法,是一種西元前250年由古希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷重複下去....
改進的素數篩
最簡單的篩素數法方法就是從2開始,將所以2的倍數去掉,然後從3開始,將3的倍數去掉。根據這樣很容易寫出 下面 就是是篩素數法得到100以內的素數並儲存到primes陣列中。cpp view plain copy by morewindows const intmaxn 100 bool flag m...