我正在实施一个解决this problem的程序。在我的算法中,我使用的事实是,如果一个奇数不能被任何较小的素数整除,那么它本身就是素数。 所以我做了一个循环,将一个数字递增2,并检查它是否可以被ArrayList中较小的素数整除。如果不是,它将被添加到该ArrayList。
问题是当观察变量时,25,35,45 ......等被添加到该列表中! 这是我的代码:
public class q6_1 {
static int x = 0;
static ArrayList<Integer> primes = new ArrayList<Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
q6_1.primes.add(3);
for (int i = 5; i < 100000; i += 2) {
ListIterator<Integer> li = q6_1.primes.listIterator();
if (i % (li.next()) == 0) {
} else {
q6_1.x++;
Integer toBeAdded = new Integer(i);
li.add(toBeAdded);
if (q6_1.x == 10001) {
System.out.println(i);
}
}
}
}
}
答案 0 :(得分:1)
仅检查新号码是否可被列表中的第一个数字整除。因此,您只消除可被3整除的数字。
使用嵌套循环遍历列表。当素数大于要测试的数字的平方根时,您可以停止。
答案 1 :(得分:0)
您的方法效率会低一些。 2也被认为是素数。查看http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes。此外,如果您不想实际实现Sieve本身,请查看包含nextProbablyPrime的BigInteger,它本身创建了Sieve(不确定它是否是我在wiki中提供的算法或不同的算法)并提出了prime号。