我是新手,我在一本書中發現了這個問題:實施埃拉托色尼篩法:一種計算素數的方法,為古希臘人所知。選擇一個 n。此方法將計算直到 n 的所有素數。首先將從 2 到 n 的所有數字插入到一個集合中。然后擦除所有2的倍數(2除外);即 4、6、8、10、12、……。擦除所有 3 的倍數;也就是說,6、9、12、15、……。提高到 。然后打印集合。我寫了這段代碼:import java.util.Iterator;import java.util.Set;import java.util.TreeSet;public class SieveOfEratosthenes { public static void main (String[] args){ System.out.print(generatePrime(20)); } public static Set generatePrime(int n){ Set<Integer> primes = new TreeSet<>(); Iterator<Integer> iter = primes.iterator(); //generate all numbers up to n and add them to the set for (int i = 2; i < n; i++){ primes.add(i); } //for numbers up to root n for (int f = 2; f <= Math.sqrt(n); f++){ while (iter.hasNext()){ int current = iter.next(); if (current % f == 0 && current != 2){ primes.remove(current); } } } return primes; }}問題是while循環中的代碼沒有實現。當我調試程序時,我發現 hasNext() 返回 null。盡管列表包含數字,但我無法弄清楚這樣做的原因。這是我從代碼中得到的輸出:[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]Process finished with exit code 0先感謝您!
1 回答

收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
要創建的Iterator 前添加元素的Set時候,你應該創建它后(里面的for循環):
Set<Integer> primes = new TreeSet<>();
//generate all numbers up to n and add them to the set
for (int i = 2; i < n; i++) {
primes.add(i);
}
//for numbers up to root n
for (int f = 2; f <= Math.sqrt(n); f++){
Iterator<Integer> iter = primes.iterator();
另外,我建議更改以下內容:
primes.remove(current);
到:
iter.remove();
為了避免任何ConcurrentModificationExceptions。
最后,您似乎仍然有一個3不在結果中的問題Set,您必須對其進行調試。
添加回答
舉報
0/150
提交
取消