找到前n个质数并将它们存储在数组中

Find the first n prime numbers and store them in an array

我需要找到第一个 n 素数 并将它们存储在数组 primes 中。借助我在 Whosebug 上找到的东西,我成功找到了第一个 n 数字,但是当我尝试将它们存储在数组中时,我得到了 ArrayIndexOutOfBoundsException...

public static int[] firstNPrimes(int n) {
    int[] primes = new int[n];
    int ncounter = 0;
    int isPrime = 2;
    for (int i = 0; ncounter < n; i++) {
        boolean prime = true;
        for (int j = 2; j < isPrime; j++) {
            if (isPrime % j == 0) {
                prime = false;
                break;
            }
        }
        if (prime) {
            primes[i] = isPrime;
            ncounter++;
        }
        isPrime++;
    }
    return primes;
}

替换

primes[i] = isPrime;

来自

primes[ncounter] = isPrime;

此计数器仅在您将元素放入数组时递增,而变量 i 会不断递增,并且还可能大于 n,因为它的限制没有条件for 循环。

您为素数数组使用了错误的索引。

更改此代码:

if (prime) {
    primes[i] = isPrime;
    ncounter++;
}

对此:

if (prime) {
    primes[ncounter] = isPrime;
    ncounter++;
}

问题出在 primes[i] = isPrime; 应该是 primes[ncounter] = isPrime;

您根本不需要 i 变量,而是使用 while 循环:

public static int[] firstNPrimes(int n) {
    int[] primes = new int[n];
    int ncounter = 0;
    int isPrime = 2;
    while (ncounter < n) {
        boolean prime = true;
        for (int j = 2; j < isPrime; j++) {
            if (isPrime % j == 0) {
                prime = false;
                break;
            }
        }
        if (prime) {
            primes[ncounter] = isPrime;
            ncounter++;
        }
        isPrime++;
    }
    return primes;
}

您的代码存在问题,您已将数组的大小固定为 n。并且您将找到的素数存储在第 i 个索引处,但是 i 可以超过 n 的值,这就是为什么您得到数组越界异常的原因。

替换

primes[i] = isPrime

primes[ncounter] = isPrime

在您最初的解决方案中,无论您是否找到新素数,您都在更新计数器 i。这导致它领先于数组的最大大小。您可以像这样使用 ncounter 变量和 while 循环:

public static int[] firstNPrimes (int n) {
    int[] primes = new int[n];
    int ncounter = 0;
    int isPrime = 2;

    while (ncounter < n) {
        boolean prime = true;
        for (int j=2; j<isPrime; j++){
            if (isPrime%j ==0){
                prime = false;
                break;
            }
        }
        if (prime){
            primes[ncounter] = isPrime;
            ncounter++;
        }
        isPrime++;
    }

    return primes;
}

一个素数是一个大于1的自然数,它不是两个较小自然数的乘积

使用Java 8你可以找到这些数字如下:

int n = 10;
int[] primes = IntStream
        // infinite sequential ordered IntStream
        // starting at 2 in increments of 1
        .iterate(2, i -> i + 1)
        // filter prime numbers
        .filter(i -> IntStream
                // numbers from 2 to current number
                .range(2, i)
                // do not divide the current
                // number without a remainder
                .allMatch(j -> i % j != 0))
        // first 'n' prime numbers
        .limit(n)
        // return an array
        .toArray();

// output
System.out.println(Arrays.toString(primes));
// [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]