第 10001 个质数是多少?为什么我的 Java 解决方案给出错误 ArrayIndexOutOfBoundsException?
What is the 10001st prime number? Why does my Java solution give the error ArrayIndexOutOfBoundsException?
所以这是我的 Java Project Euler #7 代码(代码中注释掉的问题描述):
// By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
// What is the 10001st prime number?
boolean isPrime = true;
long [] primes = new long[10001];
int j = 0;
while (j < 10001){
for (long i = 2; i < 1000000000000000L; i++) {
for (long k = i; k < i / 2; k++) {
if (i % k == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes[j] = i;
j++;
}
}
}
System.out.println(primes[10000]);
当我 运行 这段代码时,这就是我得到的结果:
线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:10001
*at vasila.mir.Main.main(Main.java from InputFileObject:22)*
当我按下 ArrayIndexOutOfBoundsException 错误时,它给我这个“找出为什么 'j' 可能是 10001”。当我按下它时,这就是我得到的:
素数[j] = i;在 Main.main(String[])(过滤器:10001)
我不明白那是什么意思,它对我没有真正的帮助。
我的代码可能有什么问题?
如果您的 for (long i = 2; i < 1000000000000000L; i++)
找到的素数超过 10001 个,您的外循环条件将永远不会及时检查以完成程序。
你应该合并循环
改变
while (j < 10001){
for (long i = 2; i < 1000000000000000L; i++) {
至
for (long i = 2; i < 1000000000000000L && j < 10001; i++) {
您还应该在外部 for 循环的开头将 isPrime
重置为 true
。
并且在内部循环中,k
应该从 2
开始,而不是 i
.
以下作品:
long [] primes = new long[10001];
int j = 0;
for (long i = 2; i < 1000000000000000L && j < 10001; i++) {
boolean isPrime = true;
for (long k = 2; k <= i / 2; k++) {
if (i % k == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes[j] = i;
j++;
}
}
System.out.println(primes[10000]);
输出:
104743
所以这是我的 Java Project Euler #7 代码(代码中注释掉的问题描述):
// By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
// What is the 10001st prime number?
boolean isPrime = true;
long [] primes = new long[10001];
int j = 0;
while (j < 10001){
for (long i = 2; i < 1000000000000000L; i++) {
for (long k = i; k < i / 2; k++) {
if (i % k == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes[j] = i;
j++;
}
}
}
System.out.println(primes[10000]);
当我 运行 这段代码时,这就是我得到的结果:
线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:10001
*at vasila.mir.Main.main(Main.java from InputFileObject:22)*
当我按下 ArrayIndexOutOfBoundsException 错误时,它给我这个“找出为什么 'j' 可能是 10001”。当我按下它时,这就是我得到的:
素数[j] = i;在 Main.main(String[])(过滤器:10001)
我不明白那是什么意思,它对我没有真正的帮助。 我的代码可能有什么问题?
如果您的 for (long i = 2; i < 1000000000000000L; i++)
找到的素数超过 10001 个,您的外循环条件将永远不会及时检查以完成程序。
你应该合并循环
改变
while (j < 10001){
for (long i = 2; i < 1000000000000000L; i++) {
至
for (long i = 2; i < 1000000000000000L && j < 10001; i++) {
您还应该在外部 for 循环的开头将 isPrime
重置为 true
。
并且在内部循环中,k
应该从 2
开始,而不是 i
.
以下作品:
long [] primes = new long[10001];
int j = 0;
for (long i = 2; i < 1000000000000000L && j < 10001; i++) {
boolean isPrime = true;
for (long k = 2; k <= i / 2; k++) {
if (i % k == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes[j] = i;
j++;
}
}
System.out.println(primes[10000]);
输出:
104743