在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數稱為素數,也叫質數。
1.算術基本定理:任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積。
2. 若乙個數 n 可以進行因數分解,則得到的兩個數一定是有乙個》=sqrt(n),另乙個<=sqrt(n)。
以下介紹3種常見的素數篩法。
此方法一般用於判斷單個數是否為素數。時間複雜度為o(√n) 。
現設要判斷n是否為素數,
列舉從2到√n的所有自然數,若這些數都不是n的因數,則n為質數。
#include
#include
#include
#include
int visit[
100000
],n,sum;
//visit[i]=1說明i不是素數
int prime_permutation[
100000];
//陣列prime_permutation儲存得到的素數
//樸素篩法
int******_sieve
(int n)
}return1;
//n為質數
}
時間複雜度:o(nloglogn)。此法一般用於質數的區間篩選,即選出區間(2,n)中的質數。
由當前已經找到的素數,從後面的數中篩去當前素數的倍數。
#include
#include
#include
#include
int visit[
100000
],n,sum;
//visit[i]=1說明i不是素數
int prime_permutation[
100000];
//陣列prime_permutation儲存得到的素數
//埃氏篩法
interatosthenes_sieve
(int n)
//n為右界}}
return0;
}
某些合數會被多次篩除,從而導致運算重複。
例如對於合數6,(設右界n=7)
時間複雜度:o(n)。此法一般用於質數的區間篩選,即選出區間(2,n)中的質數。
#include
#include
#include
#include
int visit[
100000
],n,sum;
//visit[i]=1說明i不是素數
int prime_permutation[
100000];
//陣列prime_permutation儲存得到的素數
//尤拉篩法
inteuler_sieve
(int n)
//n為右界
for(j=
0;j(i*prime_permutation[j]
<=n)
;j++)}
}return0;
}
尤拉篩法是在埃氏篩法的基礎上進行了優化。它的核心思想是保證每個合數僅被它最小的質因子篩除一次。這裡的質因子是指儲存在陣列prime_permutation中的質數。
著重注意下面這段**中的注釋:
for
(j=0
;j(i*prime_permutation[j]
<=n)
;j++
)}
尤拉篩法的難點就在於如何理解if(i%prime_permutation[j]==0)
這條判斷語句的作用。
#include
#include
#include
#include
int visit[
100000
],n,sum;
//visit[i]=1說明i不是素數
int prime_permutation[
100000];
//陣列prime_permutation儲存得到的素數
//樸素篩法
int******_sieve
(int n)
}return1;
}//埃氏篩法
interatosthenes_sieve
(int n)
//n為右界}}
return0;
}//尤拉篩法
inteuler_sieve
(int n)
//n為右界
for(j=
0;j(i*prime_permutation[j]
<=n)
;j++)}
}return0;
}int
main()
memset
(prime_permutation,0,
sizeof
(prime_permutation));
printf
("\n");
//使用尤拉篩法篩選素數並輸出結果
euler_sieve
(n);
for(i=
0;i)return0;
}
素數篩法(素數篩 線性篩)
求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...
篩法求素數 線性篩法求素數
2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...
Eratosthenes篩法(素數篩)
最一般的素數篩思想很簡單,對於不超過maxx的每個非負整數p,刪除2p,3p,4p,然後剩下的就是素數,複雜度o nlogn 因為對內層迴圈n 2 n 3 n n 小於 1 1 2 1 3 1 n ln n 1 其中 為尤拉常數 0.577218 應當注意,1不是素數哦 這樣已經不慢,但由於所有非素...