篩選質數方法

2021-08-20 21:58:36 字數 624 閱讀 7288

時間開銷:

100億大小花了50.847535s

10億大小花了5.761456s

因為boolean初始化是false,所以if那裡判斷不為真則執行(false則執行,true則跳過。ps:覺得不好看可以加一段初始化為true的**)

for迴圈判斷i的平方根小於陣列最大的大小,因為i*i至i*2都算過了(與前面的2*i至i*i順序相反)然後遍歷陣列。

判斷質數才繼續執行,不是質數的就沒必要了,小的質數已經把後面的設定為true了(如果你把陣列全設true,那麼if就不要!,後面的設定false)

最後,把所有能被質數i與j++(實際上是從i開始)的倍數設定為true(非質數)。素數就出來了

對了,long是為了避免乘法溢位

boolean map=new boolean[100000000];

for (long i=2;i*i優化主要是節約儲存空間。可以設想,所有的雙數都不是質數,所有剔除所有的雙數。

在儲存的時候用(x-1)/2

在取出的時候用x*2+1

單獨保留2就行了。

繼續優化:因為boolean型別是占用1byte,但是它只需要1bit就能描述

所以可以用byte儲存8個bit來壓縮,使記憶體消耗降低7/8。

質數篩選 素數篩選法

int prime 100010 void prime for int i 1 i i 1000000 i define size 1000000 int main 元素值為0代表是素數 int prime size int pos 0 int flag for int i 2 i size i p...

質數 篩選法

篩數法求素數 篩數法求素數的基本思想是 把從1開始的 某一範圍內的正整數從小到大順序排列,1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然後去掉它的倍數。依次類推,直到篩子為空時結束。public void printprimes int n 定義arr陣列來表示篩選出來的素數 boole...

質數篩選 快速篩選出小於等於N的質數

此方法非常的簡單 1.維護乙個陣列vectorprime n 1,true 既讓陣列中的所有數都為真,表明它是質數。2.對於每乙個質數,刪除它的倍數,因為質數的倍數一定是合數。讓後將陣列中對應的數改為false,這樣就可以避免遍歷他。如下 int findprime int n return res...