篩法求素數

2021-10-18 05:17:40 字數 856 閱讀 7315

思路:

在求小於等於n的所有素數之和的時候,首先應把[1:n]內的全部素數找出來,採用素數定義的方法找素數會比較慢,而篩法則較快。

篩法的基本思想就是對任意的合數a(1<=a<=n),其必定有乙個素因子p(1<=p<=a^0.5),而a的0.5次方小於等於n的0.5次方,所以有1<=p<=n的0.5次方,那麼我們從1到n的0.5次方遍歷一遍找出所有的素數,求其倍數,就能找出[1:n]內的所有合數,篩去合數後,剩下的自然是素數。

**如下

#include

#include

using

namespace std;

bool prime[

1000001];

void

eratosthenes

(int n)}}

}int

main()

}

#include

#include

#define ll long long

using

namespace std;

ll prime[

1000001];

bool num[

1000001];

void

eratosthenes

(int n)

ll sum=0;

//對[0:n]範圍內的素數求和

for(ll i=

1;i) sum+

=prime[i]

; cout<}int

main()

}

篩法求素數 線性篩法求素數

2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...

素數篩法求素數

素數篩類似於打表標記,預先處理掉非素數的數,即素數的倍數 任意非素數都可以由幾個素數相乘得到 於是效率比暴力求解快得多。埃氏篩法的效率為o n loglog n 簡單易懂,但是會重複標記,比如當i為2時,6會被標記掉,然而當i為3時,6又會被重複標記,這樣的重複訪問加大了時間複雜度,於是有了尤拉篩。...

篩法求素數

素數篩法就是每次把已知的素數的倍數曬去,篩掉前sqrt n 中素數的倍數就可以了 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數...