使用Erastothene筛选找到2到1000的素数

时间:2014-11-14 20:22:27

标签: java arrays primes

我一直试图找到一些关于如何使用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]);

            }

        }



    }

2 个答案:

答案 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));
}