尋找素數方法有很多,下面介紹幾種常用的方法。很多小夥伴在剛開始程式設計時對於找素數的題目,第一反應是–這還不簡單(迴圈+判斷)我分分鐘ac掉你~~。但是**提交後發現,尼瑪?咋肥事捏!!!總有個別測試點因為執行超時而不能通過。
素數的定義:素數又稱為質數,是指除了1和本身之外,不能被其他數整除的一類數。方法一:乙個整數n為素數,則它不能被2,3本文解決兩個問題:1、如何判斷給定的正整數n是否為質數;2、用最短時間得到1~n的素數表。
,...
,n−1
2,3,...,n-1
2,3,..
.,n−
1中的任何乙個整除。如果這樣判斷的話時間複雜度為o(n
)o(n)
o(n)
。單純一道求解素數的題目,顯然沒有問題,但是=_=,你以為呢???不妨試試這道題[c++ 藍橋杯adv-184 演算法提高 素數求和]。
方法一的改進:
注意到如果在2~n-1中存在n的約數,不妨設為k,即n
n%k==0
n,那麼由k∗(
n/k)
==nk*(n/k)==n
k∗(n/k
)==n
可知,n/k
n/kn/
k也是n的乙個約數。且n
nn與n/k
n/kn/
k中一定滿足其中乙個小於等於n
\sqrt n
n,另乙個大於等於n
\sqrt n
n。所以,只需要判定n是否能被2,3
,...
,2,3,...,
2,3,..
.,⌊ n⌋
\left\lfloor\sqrt n\right\rfloor
⌊n⌋
中的乙個整除,即可判定n是否為素數。該演算法的時間複雜度為o(n
)o(\sqrt n)
o(n)。
放上**:
bool isprime(int n)
return true;
}
這種寫
法較為簡
單,但是
當i接近
int型
變數上界
時會導致
i∗i溢
出(當n
在109
以內都會
是安全的
),解決
辦法是將
i定義為
long
long
型,這樣
就不會溢
出了。這種寫法較為簡單,但是當i接近int型變數上界時會導致i*i溢位(當n在10^9以內都會是安全的),解決辦法是將i定義為long long型,這樣就不會溢位了。
這種寫法較為
簡單,但
是當i接
近int
型變數上
界時會導
致i∗i
溢位(當
n在10
9以內都
會是安全
的),解
決辦法是
將i定義
為lon
glon
g型,這
樣就不會
溢位了。
方法一:列舉
從1~n進行列舉,判斷每個數是否為素數,如果是,則加入素數表。這樣列舉的時間複雜度是o(n
)o(n)
o(n)
,而判斷素數的時間複雜度是o(n
)o(\sqrt n)
o(n
),總的時間複雜度是o(n
n)o(n\sqrt n)
o(nn)
,這個複雜度對n
nn不超過105
10^5
105的大小是沒有問題的。
可結合方法一解決,自己實現一下吧~~
int v[101]=;//陣列長度要與n大小匹配哦,這裡假設n=100;,該思想結合了雜湊雜湊
void find_prime()
for(int j=1;j<=n;j++)^n \frac)=o(n\log \log n)
o(∑i=1
nin
)=o
(nloglogn)
,自己記住就好了吧^ _^
**如下:
int v[1001]=;//陣列長度要與n大小匹配哦 ,該思想結合了雜湊雜湊
void find_prime()
} }for(int k=1;k<=n;k++){//輸出素數表
if(v[k]==0) cout<方法三:尤拉篩法 時間複雜度o(n
)o(n)
o(n)
基本思想:在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的。
先寫到這吧。。。
尤拉篩法講解 **鏈結來自嗶哩嗶哩
尤拉篩法(線性篩)的學習理解 csdn參考鏈結
本文所講的一道水題 c++ 藍橋杯adv-184 演算法提高 素數求和
素數篩法 埃氏篩及尤拉篩
在做題中會經常遇到有關素數的問題,整理一下學過的兩種素數篩法。時間複雜度 o nloglogn 我們知道乙個素數的倍數肯定是乙個合數,乙個合數可以由多個素數相乘得到,所以可以從2開始把2的倍數篩一遍,找到下個素數在篩一遍。篩完後素數的倍數都被篩掉了,剩下的就是素數。如下 const int n 1e...
素數之埃氏篩法 尤拉篩法
判斷數n是否為乙個素數,基本方法為從2開始向後列舉,若n不能被2,3,4,n 1整除,則n為素數,該判斷方法的時間複雜度為o n o n o n 更快的方法為,當列舉至n sqrt n n 時即可判斷是否為素數,該判斷方法的時間複雜度為o n o sqrt n o n 如下 寫法1,其中sqrt函式...
線性篩法求素數(埃氏篩法 尤拉篩法)
篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...