找到前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]
我需要找到第一个 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]