在c++中,篩素數是乙個非常重要演算法。
我花了半天時間才明白的尤拉篩(我實在是太蒻了)。
最愚蠢的方法:
1 #include2intmain()10}
11 printf("no"
);12 }
普通方法:
1 #include2intmain()10}
11 printf("no"
);12 }
以上兩種方法其實都是判定方法,並不是篩法,下面說真正的篩法:
1.埃篩法:
1 #include2using
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...