本文介紹了埃拉托色尼的篩子,產生質數。循環的問題的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試使用Eratosthenes算法的篩子來生成n個素數。我對它進行了調試,發現在某個時候,它會開始刪除已經刪除的號碼。我不知道出了什么問題,但我敢肯定是我的圈圈出了問題。你能幫幫我嗎?
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Part6 {
public static List<Integer> primeSequence(int n) {
List<Integer> list = IntStream.range(2, n).boxed().collect(Collectors.toList());
for (int i = 2; i <= list.size(); i++) {
for (int j = i + 1; j <= list.size(); j++) {
if(j % i == 0)
list.remove(j);
}
}
return list;
}
public static void main(String[] args) {
System.out.println(primeSequence(Integer.parseInt(args[0])));
}
}
推薦答案
這就是Eratosthenes篩子的工作方式,它始終標記該范圍內除其自身以外的所有數字的倍數。
例如,當我們從i=2
開始時,我們將4、6、8、10、12、…標記為composite
。
同樣對于i=3
,它將6、9、12、15、…標記為非質數。
請注意6
&;12
被標記了兩次。還有更多的數字會多次標記為復合數字。因此,這是正常的。
現在,上述程序存在以下問題:
-
當您執行
list.remove(j)
時,它實際上刪除了索引j
處的數字,而不是數字j
本身。因此,要刪除復合數字j
,我們需要使用Integer.valueOf(j)
循環的上限不應為
list.size()
,因為隨著我們不斷刪除數字,列表的大小將不斷減小。因此,許多數字將丟失。
下面是您的代碼的修改版本:
for (int i = 2; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (j % i == 0)
{
list.remove(Integer.valueOf(j));
}
}
System.out.println(list);
}
輸入:100
輸出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
這篇關于埃拉托色尼的篩子,產生質數。循環的問題的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,