找到前n个素数并存储在数组中

时间:2017-02-23 15:20:07

标签: java

我需要找到前n个素数并将它们存储在数组素数中。借助我在stackoverflow上找到的东西,我成功找到了前n个数字,但是当我尝试将它们存储在数组中时,我得到了IndexArrayOutOfBound异常......

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;
}

6 个答案:

答案 0 :(得分:1)

替换

primes[i] = isPrime;

通过

primes[ncounter] = isPrime;

此计数器仅在您将一个元素放入数组时递增,而变量i继续增加,并且也可以变得大于n,因为在for的限制中没有条件循环。

答案 1 :(得分:1)

问题在于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;
    }

答案 2 :(得分:0)

你正在使用错误的索引作为素数数组。

更改此代码:

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

到此:

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

答案 3 :(得分:0)

您的代码的问题是您已将数组的大小固定为n。并且你在i th 索引中存储找到的素数,但是filter-pos-fin : {A : Set} → (xs : List A) → (Fin (length xs) → Bool) → List A filter-pos-fin [] p = [] filter-pos-fin (x ∷ xs) p = if p zero then x ∷ r else r where r = filter-pos-fin xs (p ∘ suc) 可以超过'i'的值,这就是为什么你得到数组超出范围的例外。

n替换为primes[i]=isprime

答案 4 :(得分:0)

在您的初始解决方案中,无论您是否找到新的素数,您都在更新计数器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;
}

答案 5 :(得分:0)

质数是大于 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]