我需要找到前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;
}
答案 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]