Book 篩法求素數

2022-05-24 16:33:07 字數 940 閱讀 3507

廢話不多說,就是開乙個bool陣列(較大),初始都賦為false,然後把非素數用2層迴圈找出非素數,賦為true。思路很簡單。

for(int i = 2; i <= maxn; i++)

if( !arr[i] )

for(int j = i * 2; j <= maxn; j +=i)

arr[j] = 1; //

表示是合數

for(int i = 2; i * i <= maxn; i++)

if( !arr[i] )

for(int j = i * i; j <= maxn; j +=i)

arr[j] = 1; //

表示是合數

下面看看乙個比較高效的:

#include #include 

#include

#include

using

namespace

std;

#define maxn 100000000

bool arr[maxn+5

];void

buildform()

int k = sqrt(1.0 *maxn);

for(int i = 3 ; i <= k ; i += 2)//

只考慮奇數

}return

;}

從篩法素數表我們可以看到,它核心思想是:多角度看問題、從另一面解決問題往往高效。

最近看到」乙個求乙個數所有因數和「的問題。

由於輸入的資料量巨大,所以一般的解法(即從1到n列舉相加)

肯定超時(設資料量為一百萬,求某個數m時間為c*o(m),複雜度o(m),總複雜度很容易破億數量級)

所以,換個角度,參考快速尤拉函式演算法。

void

facsum()

}}

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

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後面第乙個沒劃去的數...