快速篩法求素數

2021-08-04 18:49:38 字數 1245 閱讀 5325

**:

stack_queue的部落格

求素數是程式設計比賽中經常遇到的問題,最基本的方法是通過素數的定義直接判斷,只能被1和它本身整除的數就是素數了。這種方法適合判斷單個數是否為素數,當要求乙個範圍內素數而這個範圍又比較大時,這種方法就不太使用了,甚至程式要執行幾分鐘才能算出結果。

篩法的思想是去除要求範圍內所有的合數,剩下的就是素數了,而任何合數都可以表示為素數的乘積,因此如果已知乙個數為素數,則它的倍數都為合數。

普通的線性篩法:

#include"cstdio"

#include"cstring"

using namespace std;

#define max 100000//求max範圍內的素數

long long su[max],cnt;

bool isprime[max];

void prime()

for(long long j=i*2;j<=max;j+=i)//素數的倍數都為合數

} } int main()

{ prime();

for(long long i=1;i

普通的線性篩法雖然大大縮短了求素數的時間,但是實際上還是做了許多重複運算,比如2*3=6,在素數2的時候篩選了一遍,在素數為3時又篩選了一遍。如果只篩選小於等於素數i的素數與i的乘積,既不會造成重複篩選,又不會遺漏。時間複雜度幾乎是線性的。

優化後的線性篩法:

#include"cstdio"

#include"cstring"

using namespace std;

#define max 100000//求max範圍內的素數

long long su[max],cnt;

bool isprime[max];

void prime()

{ cnt=1;

memset(isprime,1,sizeof(isprime));//初始化認為所有數都為素數

isprime[0]=isprime[1]=0;//0和1不是素數

for(long long i=2;i<=max;i++)

{ if(isprime[i])

su[cnt++]=i;//儲存素數i

for(long long j=1;j

快速篩法求素數

篩法的思想是去除要求範圍內所有的合數,剩下的就是素數了,而任何合數都可以表示為素數的乘積,因此如果已知乙個數為素數,則它的倍數都為合數。1 include2 using namespace std 3 define max 100000 4long long su max cnt 5bool isp...

素數快速求法 篩法求素數

在做題的過程中,我們會遇到一些需要求素數的要求,如果對於資料範圍很小的資料,我們有最簡單但是最耗時間的雙for迴圈巢狀法。下面舉個例子。question get the primes from 1 to 100 and print them.素數求法 基礎for迴圈法 include include...

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

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