舉例:篩選從1—n的所有素數
第一種
暴力判斷,無優化。直接根據素數的定義判斷即可
#include
intmain()
;for
(int i=
2; i<=n; i++
)for
(int i=
1; i<=n; i++)if
(prime[i]
)printf
("%d\n"
,i);
}
第二種
素數的倍數一定不是素數,對其進行標記。最後遍歷一遍陣列,可得未被標記的即為篩選出的素數。
#include
int prime[
1100]=
;//初始化0,假設全部是素數,標記為0;
intmain()
}for
(int i=
1;i<=n;i++)if
(prime[i]==0
)printf
("%d\n"
,i);
}
第三種
線性篩法:不選重複過的數,大大加快了**執行時間
注意這個分解:任意乙個合數都可分解為素數相乘,如4=2x2;12=2x2x3;15=3x5 ……
#include
intmain()
;int prime[
1000]=
;int n=
1000
,cnt=0;
//cnt同上,計數,表示下標
for(
int i=
2; i<=n; i++
)//對2-n的數進行遍歷
}for
(int i=
0; i<=n; i++)if
(prime[i]
)printf
("%d\n"
,prime[i]);
}
** **會更加直觀一點 **
_ 第三種方法最快 _
篩選法判斷素數
常規的判斷1 n以內的素數的時間複雜度為o n sqrt n 在n很大的時候時間很長,所以需要別的方法來判斷素數。這裡介紹篩選法。1 申請乙個陣列bool prime n 1 初始化所有的奇數下標為true,偶數下標為false 2例外 2 for int i 3 i sqrt n i 2 3 最後...
素數判斷與素數篩選法
方法一 直接判斷,思想簡單,實現比較簡單,但是複雜度過高bool isprime int a return true 方法二 素數篩選法 eratosthenes 篩法 只有素數才能當篩子 篩掉對應的倍數,不超過要求的範圍即可 遍歷一遍 void getprime int n 從i i開始計算 j ...
(基本數論)素數篩選與判斷
這種方法就是將給出的數判斷能否找到處1以及它本身以外的因數。樣例 include using namespace std bool f int n return 1 int main 埃氏篩法就是從2開始篩掉2的倍數 必須從2倍開始 往下依次進行。樣例 include using namespace...