埃拉託斯特尼篩法 篩選素數

2022-06-16 11:48:14 字數 1509 閱讀 5789

埃拉託斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。要得到自然數n以內的全部素數,必須把不大於根號n的所有素數的倍數剔除,剩下的就是素數。

演算法思想:要得到自然數n以內的全部素數,必須把不大於

的所有素數的倍數剔除,剩下的就是素數。

給出要篩數值的範圍n,找出n以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去......。

練習:力扣第204題

統計所有小於非負整數 n 的質數的數量。

分析思路:

設定乙個布林型別的陣列,陣列的大小是n+1,n是給定的非負整數,如果陣列索引值代表的數是乙個素數,那麼其對應的陣列值是true,否則為false。然後從2這個最小質數開始遍歷,如果當前遍歷的陣列值為true則說明不是素數,那麼就終止此次迴圈,開啟下乙個迴圈;否則就將以這個素數的所有小於n的倍數為索引值的陣列值設定為true。實現的**如下:

public

int countprimes(int

n)

int count = 0;

boolean iss = new

boolean[n + 1];

for (int i = 2; i < n; i++)

count++;

for (int j = 1; j * i < n; j++)

}return

count;

}

優化一下,這個借鑑了cyc2018大神的解法,他在從2開始將每乙個素數的倍數索引對應的陣列值設定為true的時候,游標變數並不是每次加1,而是每次加上當前素數值,內部迴圈,游標的初始值是當前素數的平方。

我對此的分析是,大於1的自然數中,既分為質數和合數,也分為奇數和偶數,對於偶數除了2以外一定不是質數,那麼通過2就可以將小於n大於2的所有偶數排除掉了,而這些偶數都可以拆分為多個2相加,剩下的就只是奇數了;對於大於2的質數,一定是奇數,但是奇數不一定是質數,所以對於剩下的既是奇數又是合數的數,它是不能被2整除的,能整除它的就只有是奇數,而這些奇數又都可以拆分為奇數個素數相加,所以將游標的遞增設定為  每次前進當前素數個步數。

實現**如下:

public

int countprimes(int

n)

int count = 0;

boolean iss = new

boolean[n + 1];

for (int i = 2; i < n; i++)

count++;

for (long j = (long)(i)*i; j < n; j+=i)

}return

count;

}

在此紀念一下,力扣寫了100道了,個中酸甜苦辣都有,繼續堅持,為了夢想!!!

埃拉託斯特尼篩法 檢定素數

埃拉託斯特尼篩法描述 要得到自然數n以內的全部素數,必須把不大於 給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷重複下去.題目 統計找出一千萬以內,一共有...

埃拉託斯特尼篩法

質數又稱素數。指在乙個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。怎麼判斷n以內的哪些數是質數呢?厄拉多塞是一位古希臘數學家,他在尋找素數時,採用了一種與眾不同的方法 先將2 n的各數放入表中,然後在2的上面畫乙個圓圈,然後劃去2的其他倍數 第乙個既未畫圈又沒有被劃去的數是3,...

埃拉託斯特尼篩法

埃拉託斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。要得到自然數n以內的全部素數,必須把小於等於根號n的所有素數的倍數剔除,剩下的就是素數。這是什麼意思呢?以100為例,我們先建立乙個擁有101 0 100 個數字的陣列。先使用最小的素數2,將所有2...