【发布时间】:2018-01-16 16:36:01
【问题描述】:
我正在使用Sieve of Eratosthenes 算法来查找某个范围内的素数(从最小值到最大值)。但是,如果我包含最小值,我似乎无法让它工作。
这是我的 Java 代码:
protected static List<Integer> getSievePrimes(int a, int b) {
List<Integer> primeNumbers = new ArrayList();
boolean [] isComposite = new boolean [b + 1];
isComposite[1] = true;
// Mark all composite numbers
for (int i = 2; i <= b; i++) {
// for (int i = a == 1 ? 2 : a; i <= b; i++) {
if (!isComposite[i]) {
// 'i' is a prime number
//if (i >= a) {
primeNumbers.add(i);
//}
int multiple = 2;
while (i * multiple <= b) {
isComposite [i * multiple] = true;
multiple++;
}
}
}
return primeNumbers;
}
如您所见,它目前仅适用于最大值 (b),而不是最小值 (a)。
问题
如何修改上述方法以同时满足最小值和最大值?
【问题讨论】:
-
看我的回答here。
-
您会在
primeNumbers中找到第一个索引i,这样primeNumbers[i] >= a,然后使用Arrays.copyOf()之类的东西返回子数组primeNumbers[i]...primeNumbers[primeNumbers.length-1]。或者您可以禁止添加素数,除非它 >= `a'。 -
从最小值开始会导致误报。例如 min 1000 和 max 1003 会将 1000、1001、1002 和 1003 识别为素数。
标签: java primes sieve-of-eratosthenes