任何合數都可以表示為多個素數的乘積,合數肯定有乙個最小的質因子,通過這個最小質因子篩掉合數,保留素數。
aizu0009:求小於或等於n的素數個數
n∈[1,999999]
#include#include#include
#include
using
namespace
std;
const
int maxa=1000010
;int
prime[maxa];
bool
flag[maxa];
intcnt,n;
void
find_prime()
}cout
}int
main()}/*
模擬尤拉篩:
判斷25以內的素數
數字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
判斷 f f f f f f f f f f f f f f f f
i=2;i<=25; yes;prime[0]=2;cnt=1;
forj=0;j<1 && 2*2<=25; flag[4]=false; if(2%prime[0]==0) yes break;
j=1;j<1 && no
i=3;i<=25; yes;prime[1]=3;cnt=2;
forj=0;j<2 && 2*3<=25; flag[6]=false; if(3%prime[0]==0) no
j=1;j<2 && 3*3<=25; flag[9]=false; if(3%prime[1]==0) yes break;
i=4;i<=25; no;
forj=0;j<2 && 2*4<=25; flag[8]=false; if(4%prime[0]==0) yes break;
i=5;i<=25; yes;prime[2]=5;cnt=3;
forj=0;j<3 && 2*5<=25; flag[10]=false; if(5%prime[0]==0) no
j=1;j<3 && 3*5<=25; flag[15]=false; if(5%prime[1]==0) no
j=2;j<3 && 5*5<=25; flag[25]=false; if(5%prime[2]==0) yes break;
i=6;i<=25; no;
forj=0;j<3 && 2*6<=25; flag[12]=false; if(6%prime[0]==0) yes;break;
i=7;i<=25; yes;prime[3]=7;cnt=4
forj=0;j<4 && 2*7<=25; flag[14]=false; if(7%prime[0]==0) no
j=1;j<4 && 3*7<=25; flag[21]=false; if(7%prime[1]==0) no
j=2;j<4 && 5*7=35;break;
i=8;i<=25; no
forj=0;j<4 && 2*8<=25; flag[16]=false; if(8%prime[0]==0) yes;break;
i=9;i<=25; no
forj=0;j<4 && 2*9<=25; flag[18]=false; if(9%prime[0]==0) no;
j=1;j<4 && 3*9=27;break;
i=10;i<=25; no
forj=0;j<4 && 2*10<=25; flag[20]=false; if(10%prime[0]==0) yes;break;
i=11;i<=25; yes;prime[4]=11;cnt=5
forj=0;j<5 && 2*11<=25; flag[22]=false; if(11%prime[0]==0) no
j=1;j<5 && 3*11=33;break;
i=12;i<=25; no;
forj=0;j<5 && 2*12<=25; flag[24]=false; if(12%prime[0]==0) yes;break;
i=13;i<=25; yes;prime[5]=13;cnt=6
forj=0;j<6 && 2*13=26 break;
i=14;no
forbreak;
i=15;no
forbreak;
i=16;no
forbreak;
i=17; yesprime[6]=17;cnt=7
forbreak;
i=18;no
forbreak;
i=19; yes; prime[7]=19,cnt=8
forbreak;
i=20; no
forbreak;
i=21; no
forbreak;
i=22; no
forbreak;
i=23; yes; prime[8]=23;cnt=9
forbreak;
i=24;no
forbreak;
i=25;no
forbreak;
*/
線性篩素數(尤拉篩)
尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...
尤拉篩 素數 基礎
求乙個數是不是素數,我們最開始用到的方法是從2開始跑到這個數的前一項,如若這些數都不能被這個數整除,那麼就稱這個數是素數 素數的概念是除了1和它本身之外不再有其他因數 除了1 我們稱這樣的數為素數。如果我們就按一般思路去實現求解這個數是不是素數,那麼會用for迴圈從2開始跑到這個數的前一項,每個數都...
尤拉函式 素數篩
尤拉發現求小於等於n的正整數中有多少個數與n互質可以用這個公式 euler x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有素因數,x是不為0的整數。euler 1 1 唯一和1互質的數就是1本身 尤拉公式的延伸 乙個數的所有質因子之和是e...