數論 C 線性篩素數

2022-03-30 07:06:21 字數 800 閱讀 5453

在c++中,篩素數是乙個非常重要演算法。

我花了半天時間才明白的尤拉篩(我實在是太蒻了)。

最愚蠢的方法:

1 #include2

intmain()10}

11 printf("no"

);12 }

普通方法:

1 #include2

intmain()10}

11 printf("no"

);12 }

以上兩種方法其實都是判定方法,並不是篩法,下面說真正的篩法:

1.埃篩法:

1 #include2

using

namespace

std;

3int

main();

6for(i=1;i<=100;i++)10}

11for(int p=0;p<=100;p++)

12if(a[p]==0)15

return0;

16 }

思路:首先將所有2的倍數標為1,再將所有3的倍數標為1……以此類推。

2.尤拉篩:

1

#define maxn 1000000

2int

main();

4int p[maxn]=;

5int t=0;6

for (int i=2;i)15}

16 }

思路:由於埃篩法做了許多不必要的迴圈,所以尤拉篩在埃篩法的基礎上,省去了一些步驟,時間複雜度o(n)。

數論 線性素數篩(尤拉法)

任何合數都能表示成一系列素數的積。線性素數篩的主要思想是每個合數必有乙個最小素因子,每個合數僅被它的最小素因子篩去正好一次,所以為線性時間。比如說 12 只能被 2 篩掉,12 2 6,不能被3篩掉,12 3 4 中體現在 if i prime j 0 break prime陣列中的素數是遞增的,當...

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

數論2 素數篩

判斷素數可通過試除小於 sqrt n 的素數來實現,那麼將其反過來,只要將 sqrt n 的素數的倍數都刪掉,那麼就能得到一張 n 的素數表,o n lg lg n 需劃掉合數,所以最初假設均為素數,即陣列初始化為0 bool composite maxn void generate int n f...