我一直试图找到一些关于如何使用Erastothenes筛子使用阵列打印2到1000的素数的帮助。我查看了Sieve是如何工作的,但我很难弄清楚如何编写它。
import java.util.*;
public class PrimeArray {
public static boolean isPrime(int n){
if(n<=1){
return false;
}
for(int i = 2; i*i<n; i++){
if(i%n==0)
return false;
}
return true;
}
public static void main(String[] args) {
int[] array = new int[1000];
for(int j = 2; j<array.length; j++){
if(isPrime(j))
System.out.println(array[j]);
}
}
}
答案 0 :(得分:0)
以下是Eratosthenes筛选的快速版本:
public BitSet sieve(long max){
if(max < 3) return;
BitSet isPrime = new Bitset((int)(max + 1 / 2))
ArrayList<Long> primes = new ArrayList<long>();
primes.add(2)
isPrime.set(0, true)
max = (long) Math.sqrt(max);
for(int i = 3; i < max; i+= 2){
boolean a = true;
for(int j = 0; j < primes.size(); j++){
if(i % primes.get(j) == 0){
a = false;
break;
}
}
if(a){
primes.add(i);
isPrimes.set((i - 1) / 2, true);
}
}
return isPrime;
}
答案 1 :(得分:0)
您的isPrime()
函数使用了试验版,并且有两个错误。一,测试n % i == 0
不是i % n == 0
还是两个(i * i) <= n
(不是(i * i) < n
)。如果我使用它,它可以正常工作,
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; (i * i) <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
Java数组不是动态数据结构。要使用上面的方法将2到1000的最后一个素数加到数组中,你可以做
public static void main(String[] args) {
int[] array = new int[168]; // the 168th prime is 997
int pos = 0;
for (int j = 2; pos < array.length; j++) {
if (isPrime(j)) {
array[pos++] = j;
}
}
System.out.println(Arrays.toString(array));
}